Current section
Files
Jump to
Current section
Files
src/squirrel@internal@gleam.erl
-module(squirrel@internal@gleam).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/squirrel/internal/gleam.gleam").
-export([value_identifier_to_string/1, type_identifier_to_string/1, value_identifier_to_type_identifier/1, type_identifier_to_value_identifier/1, value_identifier/1, type_identifier/1, try_make_enum/2, similar_value_identifier_string/1]).
-export_type([type/0, enum_variant/0, field/0, value_identifier/0, type_identifier/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type type() :: {list, type()} |
{option, type()} |
date |
time_of_day |
timestamp |
bit_array |
int |
float |
numeric |
bool |
string |
json |
uuid |
{enum,
binary(),
type_identifier(),
non_empty_list:non_empty_list(enum_variant())}.
-type enum_variant() :: {enum_variant, type_identifier(), binary()}.
-type field() :: {field, value_identifier(), type()}.
-opaque value_identifier() :: {value_identifier, binary()}.
-opaque type_identifier() :: {type_identifier, binary()}.
-file("src/squirrel/internal/gleam.gleam", 124).
?DOC(false).
-spec value_identifier_to_string(value_identifier()) -> binary().
value_identifier_to_string(Identifier) ->
{value_identifier, Name} = Identifier,
Name.
-file("src/squirrel/internal/gleam.gleam", 170).
?DOC(false).
-spec type_identifier_to_string(type_identifier()) -> binary().
type_identifier_to_string(Identifier) ->
{type_identifier, Name} = Identifier,
Name.
-file("src/squirrel/internal/gleam.gleam", 178).
?DOC(false).
-spec value_identifier_to_type_identifier(value_identifier()) -> type_identifier().
value_identifier_to_type_identifier(Identifier) ->
{value_identifier, Name} = Identifier,
Type_identifier = begin
_pipe = justin:pascal_case(Name),
_pipe@1 = gleam@string:to_graphemes(_pipe),
_pipe@2 = gleam@list:filter(_pipe@1, fun(C) -> C /= <<"_"/utf8>> end),
gleam@string:join(_pipe@2, <<""/utf8>>)
end,
{type_identifier, Type_identifier}.
-file("src/squirrel/internal/gleam.gleam", 197).
?DOC(false).
-spec type_identifier_to_value_identifier(type_identifier()) -> value_identifier().
type_identifier_to_value_identifier(Identifier) ->
{type_identifier, Name} = Identifier,
{value_identifier, justin:snake_case(Name)}.
-file("src/squirrel/internal/gleam.gleam", 265).
?DOC(false).
-spec is_digit(binary()) -> boolean().
is_digit(Char) ->
case Char of
<<"0"/utf8>> ->
true;
<<"1"/utf8>> ->
true;
<<"2"/utf8>> ->
true;
<<"3"/utf8>> ->
true;
<<"4"/utf8>> ->
true;
<<"5"/utf8>> ->
true;
<<"6"/utf8>> ->
true;
<<"7"/utf8>> ->
true;
<<"8"/utf8>> ->
true;
<<"9"/utf8>> ->
true;
_ ->
false
end.
-file("src/squirrel/internal/gleam.gleam", 272).
?DOC(false).
-spec is_lowercase_letter(binary()) -> boolean().
is_lowercase_letter(Char) ->
case Char of
<<"a"/utf8>> ->
true;
<<"b"/utf8>> ->
true;
<<"c"/utf8>> ->
true;
<<"d"/utf8>> ->
true;
<<"e"/utf8>> ->
true;
<<"f"/utf8>> ->
true;
<<"g"/utf8>> ->
true;
<<"h"/utf8>> ->
true;
<<"i"/utf8>> ->
true;
<<"j"/utf8>> ->
true;
<<"k"/utf8>> ->
true;
<<"l"/utf8>> ->
true;
<<"m"/utf8>> ->
true;
<<"n"/utf8>> ->
true;
<<"o"/utf8>> ->
true;
<<"p"/utf8>> ->
true;
<<"q"/utf8>> ->
true;
<<"r"/utf8>> ->
true;
<<"s"/utf8>> ->
true;
<<"t"/utf8>> ->
true;
<<"u"/utf8>> ->
true;
<<"v"/utf8>> ->
true;
<<"w"/utf8>> ->
true;
<<"x"/utf8>> ->
true;
<<"y"/utf8>> ->
true;
<<"z"/utf8>> ->
true;
_ ->
false
end.
-file("src/squirrel/internal/gleam.gleam", 102).
?DOC(false).
-spec to_value_identifier_rest(binary(), binary(), integer()) -> {ok,
value_identifier()} |
{error, squirrel@internal@error:value_identifier_error()}.
to_value_identifier_rest(Name, Rest, Position) ->
case gleam_stdlib:string_pop_grapheme(Rest) of
{error, _} ->
{ok, {value_identifier, Name}};
{ok, {Char, Rest@1}} ->
Is_valid_char = ((Char =:= <<"_"/utf8>>) orelse is_lowercase_letter(
Char
))
orelse is_digit(Char),
case Is_valid_char of
true ->
to_value_identifier_rest(Name, Rest@1, Position + 1);
false ->
{error, {value_contains_invalid_grapheme, Position, Char}}
end
end.
-file("src/squirrel/internal/gleam.gleam", 87).
?DOC(false).
-spec value_identifier(binary()) -> {ok, value_identifier()} |
{error, squirrel@internal@error:value_identifier_error()}.
value_identifier(Name) ->
case gleam_stdlib:string_pop_grapheme(Name) of
{error, _} ->
{error, value_is_empty};
{ok, {Char, Rest}} ->
case is_lowercase_letter(Char) of
true ->
to_value_identifier_rest(Name, Rest, 1);
false ->
{error, {value_contains_invalid_grapheme, 0, Char}}
end
end.
-file("src/squirrel/internal/gleam.gleam", 282).
?DOC(false).
-spec is_uppercase_letter(binary()) -> boolean().
is_uppercase_letter(Char) ->
case Char of
<<"A"/utf8>> ->
true;
<<"B"/utf8>> ->
true;
<<"C"/utf8>> ->
true;
<<"D"/utf8>> ->
true;
<<"E"/utf8>> ->
true;
<<"F"/utf8>> ->
true;
<<"G"/utf8>> ->
true;
<<"H"/utf8>> ->
true;
<<"I"/utf8>> ->
true;
<<"J"/utf8>> ->
true;
<<"K"/utf8>> ->
true;
<<"L"/utf8>> ->
true;
<<"M"/utf8>> ->
true;
<<"N"/utf8>> ->
true;
<<"O"/utf8>> ->
true;
<<"P"/utf8>> ->
true;
<<"Q"/utf8>> ->
true;
<<"R"/utf8>> ->
true;
<<"S"/utf8>> ->
true;
<<"T"/utf8>> ->
true;
<<"U"/utf8>> ->
true;
<<"V"/utf8>> ->
true;
<<"W"/utf8>> ->
true;
<<"X"/utf8>> ->
true;
<<"Y"/utf8>> ->
true;
<<"Z"/utf8>> ->
true;
_ ->
false
end.
-file("src/squirrel/internal/gleam.gleam", 148).
?DOC(false).
-spec to_type_identifier_rest(binary(), binary(), integer()) -> {ok,
type_identifier()} |
{error, squirrel@internal@error:type_identifier_error()}.
to_type_identifier_rest(Name, Rest, Position) ->
case gleam_stdlib:string_pop_grapheme(Rest) of
{error, _} ->
{ok, {type_identifier, Name}};
{ok, {Char, Rest@1}} ->
Is_valid_char = (is_lowercase_letter(Char) orelse is_uppercase_letter(
Char
))
orelse is_digit(Char),
case Is_valid_char of
true ->
to_type_identifier_rest(Name, Rest@1, Position + 1);
false ->
{error, {type_contains_invalid_grapheme, Position, Char}}
end
end.
-file("src/squirrel/internal/gleam.gleam", 134).
?DOC(false).
-spec type_identifier(binary()) -> {ok, type_identifier()} |
{error, squirrel@internal@error:type_identifier_error()}.
type_identifier(Name) ->
case gleam_stdlib:string_pop_grapheme(Name) of
{error, _} ->
{error, type_is_empty};
{ok, {Char, Rest}} ->
case is_uppercase_letter(Char) of
false ->
{error, {type_contains_invalid_grapheme, 0, Char}};
true ->
to_type_identifier_rest(Name, Rest, 1)
end
end.
-file("src/squirrel/internal/gleam.gleam", 228).
?DOC(false).
-spec try_make_enum(binary(), list(binary())) -> {ok, type()} |
{error, squirrel@internal@error:enum_error()}.
try_make_enum(Raw_name, Variants) ->
gleam@result:'try'(
begin
_pipe = justin:pascal_case(Raw_name),
_pipe@1 = type_identifier(_pipe),
gleam@result:replace_error(_pipe@1, {invalid_enum_name, Raw_name})
end,
fun(Name) ->
{Variants@1, Errors} = gleam@result:partition(
begin
gleam@list:map(
Variants,
fun(Variant) ->
case type_identifier(justin:pascal_case(Variant)) of
{ok, Name@1} ->
{ok, {enum_variant, Name@1, Variant}};
{error, _} ->
{error, Variant}
end
end
)
end
),
case Errors of
[] ->
case non_empty_list:from_list(Variants@1) of
{ok, Variants@2} ->
{ok, {enum, Raw_name, Name, Variants@2}};
{error, _} ->
{error, enum_with_no_variants}
end;
_ ->
{error, {invalid_enum_variants, Errors}}
end
end
).
-file("src/squirrel/internal/gleam.gleam", 291).
?DOC(false).
-spec is_identifier_char(binary()) -> boolean().
is_identifier_char(Char) ->
((Char =:= <<"_"/utf8>>) orelse is_lowercase_letter(Char)) orelse is_digit(
Char
).
-file("src/squirrel/internal/gleam.gleam", 209).
?DOC(false).
-spec similar_value_identifier_string(binary()) -> {ok, binary()} | {error, nil}.
similar_value_identifier_string(String) ->
Proposal = begin
_pipe = gleam@string:trim(String),
_pipe@1 = justin:snake_case(_pipe),
_pipe@2 = gleam@string:to_graphemes(_pipe@1),
_pipe@3 = gleam@list:drop_while(
_pipe@2,
fun(G) -> (G =:= <<"_"/utf8>>) orelse is_digit(G) end
),
_pipe@4 = gleam@list:filter(_pipe@3, fun is_identifier_char/1),
gleam@string:join(_pipe@4, <<""/utf8>>)
end,
case Proposal of
<<""/utf8>> ->
{error, nil};
_ ->
{ok, Proposal}
end.