Packages

A simple and ergonomic string formatter for Gleam

Current section

Files

Jump to
mat src mat.erl
Raw

src/mat.erl

-module(mat).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([format1/2, format2/3, format3/4, format4/5, format5/6, format_list/2]).
-spec default_converter(any()) -> binary().
default_converter(Value) ->
Dyn_val = gleam@dynamic:from(Value),
gleam@bool:guard(
gleam@dynamic:classify(Dyn_val) =:= <<"Function"/utf8>>,
<<"<function>"/utf8>>,
fun() -> case gleam@dynamic:string(Dyn_val) of
{error, _} ->
gleam@string:inspect(Value);
{ok, V} ->
V
end end
).
-spec inner_format_once(binary(), FRK, fun((FRK) -> binary())) -> {binary(),
binary()}.
inner_format_once(Template, Value, Converter) ->
case gleam@string:split_once(Template, <<"{}"/utf8>>) of
{ok, {Pre, Post}} ->
{<<Pre/binary, (Converter(Value))/binary>>, Post};
{error, nil} ->
{Template, <<""/utf8>>}
end.
-spec format1(binary(), any()) -> binary().
format1(Template, A) ->
{F, Rest} = inner_format_once(Template, A, fun default_converter/1),
<<F/binary, Rest/binary>>.
-spec format2(binary(), any(), any()) -> binary().
format2(Template, A, B) ->
{F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
{F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
<<<<F1/binary, F2/binary>>/binary, Rest@1/binary>>.
-spec format3(binary(), any(), any(), any()) -> binary().
format3(Template, A, B, C) ->
{F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
{F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
{F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
<<<<<<F1/binary, F2/binary>>/binary, F3/binary>>/binary, Rest@2/binary>>.
-spec format4(binary(), any(), any(), any(), any()) -> binary().
format4(Template, A, B, C, D) ->
{F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
{F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
{F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
{F4, Rest@3} = inner_format_once(Rest@2, D, fun default_converter/1),
<<<<<<<<F1/binary, F2/binary>>/binary, F3/binary>>/binary, F4/binary>>/binary,
Rest@3/binary>>.
-spec format5(binary(), any(), any(), any(), any(), any()) -> binary().
format5(Template, A, B, C, D, E) ->
{F1, Rest} = inner_format_once(Template, A, fun default_converter/1),
{F2, Rest@1} = inner_format_once(Rest, B, fun default_converter/1),
{F3, Rest@2} = inner_format_once(Rest@1, C, fun default_converter/1),
{F4, Rest@3} = inner_format_once(Rest@2, D, fun default_converter/1),
{F5, Rest@4} = inner_format_once(Rest@3, E, fun default_converter/1),
<<<<<<<<<<F1/binary, F2/binary>>/binary, F3/binary>>/binary, F4/binary>>/binary,
F5/binary>>/binary,
Rest@4/binary>>.
-spec inner_format(binary(), list(FRN), fun((FRN) -> binary())) -> binary().
inner_format(Template, Values, Converter) ->
case Values of
[] ->
Template;
[Value | Rest] ->
case gleam@string:split_once(Template, <<"{}"/utf8>>) of
{ok, {Pre, Post}} ->
<<<<Pre/binary, (Converter(Value))/binary>>/binary,
(inner_format(Post, Rest, Converter))/binary>>;
{error, nil} ->
Template
end
end.
-spec format_list(binary(), list(any())) -> binary().
format_list(Template, Values) ->
inner_format(Template, Values, fun default_converter/1).