diff options
-rw-r--r-- | src/gleam_stdlib.erl | 72 | ||||
-rw-r--r-- | test/gleam/string_test.gleam | 58 |
2 files changed, 59 insertions, 71 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index 959d14d..76b51f8 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -28,11 +28,11 @@ end). -define(is_lowercase_char(X), (X > 96 andalso X < 123)). - -define(is_underscore_char(X), (X == 95)). - -define(is_digit_char(X), (X > 47 andalso X < 58)). +uppercase(X) -> X - 32. + map_get(Map, Key) -> case maps:find(Key, Map) of error -> {error, nil}; @@ -371,11 +371,11 @@ inspect(false) -> "False"; inspect(nil) -> "Nil"; -inspect(Any) when is_atom(Any) -> - AtomAsList = erlang:atom_to_list(Any), - case inspect_maybe_gleam_atom(AtomAsList, none, []) of - {ok, GleamCompatibleAtomString} -> erlang:list_to_binary(GleamCompatibleAtomString); - {error, no_gleam_atom} -> ["//erl('", erlang:atom_to_binary(Any), "')"] +inspect(Atom) when is_atom(Atom) -> + Binary = erlang:atom_to_binary(Atom), + case inspect_maybe_gleam_atom(Binary, none, <<>>) of + {ok, Inspected} -> Inspected; + {error, _} -> ["//erl('", Binary, "')"] end; inspect(Any) when is_integer(Any) -> erlang:integer_to_list(Any); @@ -417,36 +417,38 @@ inspect(Any) when is_function(Any) -> inspect(Any) -> ["//erl(", io_lib:format("~p", [Any]), ")"]. -inspect_maybe_gleam_atom([], none, []) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([Head | _Rest], none, []) when ?is_digit_char(Head) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([$_ | _Rest], none, []) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([$_ | []], _PrevChar, _Acc) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([$_ | _Rest], $_, _Acc) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([Head | _Rest], _PrevChar, _Acc) - when not (?is_lowercase_char(Head) orelse ?is_underscore_char(Head) orelse ?is_digit_char(Head)) -> - {error, no_gleam_atom}; -inspect_maybe_gleam_atom([Head | Rest], none, Acc) -> - inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]); -inspect_maybe_gleam_atom([$_ | Rest], _PrevChar, Acc) -> + +inspect_maybe_gleam_atom(<<>>, none, _) -> + {error, nil}; +inspect_maybe_gleam_atom(<<First, _Rest/binary>>, none, _) when ?is_digit_char(First) -> + {error, nil}; +inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, none, _) -> + {error, nil}; +inspect_maybe_gleam_atom(<<"_">>, _PrevChar, _Acc) -> + {error, nil}; +inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, $_, _Acc) -> + {error, nil}; +inspect_maybe_gleam_atom(<<First, _Rest/binary>>, _PrevChar, _Acc) + when not (?is_lowercase_char(First) orelse ?is_underscore_char(First) orelse ?is_digit_char(First)) -> + {error, nil}; +inspect_maybe_gleam_atom(<<First, Rest/binary>>, none, Acc) -> + inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>); +inspect_maybe_gleam_atom(<<"_", Rest/binary>>, _PrevChar, Acc) -> inspect_maybe_gleam_atom(Rest, $_, Acc); -inspect_maybe_gleam_atom([Head | Rest], $_, Acc) -> - inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]); -inspect_maybe_gleam_atom([Head | Rest], PrevChar, Acc) when ?is_digit_char(PrevChar) -> - inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]); -inspect_maybe_gleam_atom([Head | Rest], _PrevChar, Acc) -> - inspect_maybe_gleam_atom(Rest, Head, [Head | Acc]); -inspect_maybe_gleam_atom([], _PrevChar, Acc) -> - {ok, lists:reverse(Acc)}. +inspect_maybe_gleam_atom(<<First, Rest/binary>>, $_, Acc) -> + inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>); +inspect_maybe_gleam_atom(<<First, Rest/binary>>, _PrevChar, Acc) -> + inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, First>>); +inspect_maybe_gleam_atom(<<>>, _PrevChar, Acc) -> + {ok, Acc}; +inspect_maybe_gleam_atom(A, B, C) -> + erlang:display({A, B, C}), + throw({gleam_error, A, B, C}). inspect_list([]) -> {proper, []}; -inspect_list([Head]) -> - {proper, [inspect(Head)]}; +inspect_list([First]) -> + {proper, [inspect(First)]}; inspect_list([First | Rest]) when is_list(Rest) -> {Kind, Inspected} = inspect_list(Rest), {Kind, [inspect(First), <<", ">> | Inspected]}; @@ -456,8 +458,8 @@ inspect_list([First | ImproperTail]) -> inspect_maybe_utf8_string(Binary, Acc) -> case Binary of <<>> -> {ok, <<$", Acc/binary, $">>}; - <<Head/utf8, Rest/binary>> -> - Escaped = case Head of + <<First/utf8, Rest/binary>> -> + Escaped = case First of $" -> <<$\\, $">>; $\\ -> <<$\\, $\\>>; $\r -> <<$\\, $r>>; diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam index c072800..5b9b2a5 100644 --- a/test/gleam/string_test.gleam +++ b/test/gleam/string_test.gleam @@ -999,55 +999,45 @@ fn string_to_erlang_atom(a: String) -> Dynamic @target(erlang) pub fn inspect_erlang_atom_is_valid_in_gleam_test() { - string_to_erlang_atom("a_common_erlang_atom_is_valid_in_gleam") + string_to_erlang_atom("one_two") |> string.inspect - |> should.equal("ACommonErlangAtomIsValidInGleam") + |> should.equal("OneTwo") - string_to_erlang_atom( - "an_erlang_atom_with_1_or_many_non_leading_digits_is_valid_in_gleam", - ) + string_to_erlang_atom("one1_two") + |> string.inspect + |> should.equal("One1Two") + + string_to_erlang_atom("one1two") |> string.inspect - |> should.equal("AnErlangAtomWith1OrManyNonLeadingDigitsIsValidInGleam") + |> should.equal("One1two") } @target(erlang) pub fn inspect_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam_test() { - string_to_erlang_atom( - "_an_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam", - ) + string_to_erlang_atom("_ok") |> string.inspect - |> should.equal( - "//erl('_an_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam')", - ) + |> should.equal("//erl('_ok')") } @target(erlang) pub fn inspect_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_test() { - string_to_erlang_atom( - "an_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_", - ) + string_to_erlang_atom("ok_") |> string.inspect - |> should.equal( - "//erl('an_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_')", - ) + |> should.equal("//erl('ok_')") } @target(erlang) pub fn inspect_erlang_atom_with_a_double_underscore_is_invalid_in_gleam_test() { - string_to_erlang_atom("an_erlang_atom_with_a_double__underscore_is_invalid") + string_to_erlang_atom("ok__ok") |> string.inspect - |> should.equal( - "//erl('an_erlang_atom_with_a_double__underscore_is_invalid')", - ) + |> should.equal("//erl('ok__ok')") } @target(erlang) pub fn inspect_erlang_atom_with_white_spaces_is_invalid_in_gleam_test() { - string_to_erlang_atom("an erlang atom with white spaces is invalid in gleam") + string_to_erlang_atom("ok ok") |> string.inspect - |> should.equal( - "//erl('an erlang atom with white spaces is invalid in gleam')", - ) + |> should.equal("//erl('ok ok')") } @target(erlang) @@ -1060,24 +1050,20 @@ pub fn inspect_erlang_atom_that_is_an_empty_string_is_invalid_in_gleam_test() { @target(erlang) pub fn inspect_erlang_atom_with_uppercases_invalid_in_gleam_test() { - string_to_erlang_atom("AnErlangAtomWithUpperCasesIsInvalidInGleam") + string_to_erlang_atom("Upper") |> string.inspect - |> should.equal("//erl('AnErlangAtomWithUpperCasesIsInvalidInGleam')") + |> should.equal("//erl('Upper')") } @target(erlang) pub fn inspect_erlang_atom_with_leading_digit_invalid_in_gleam_test() { - string_to_erlang_atom( - "1_erlang_atom_with_a_leading_digit_is_invalid_in_gleam", - ) + string_to_erlang_atom("1_ok") |> string.inspect - |> should.equal( - "//erl('1_erlang_atom_with_a_leading_digit_is_invalid_in_gleam')", - ) + |> should.equal("//erl('1_ok')") - string_to_erlang_atom("1ErlangAtomWithALeadingDigitIsInvalidInGleam") + string_to_erlang_atom("1Ok") |> string.inspect - |> should.equal("//erl('1ErlangAtomWithALeadingDigitIsInvalidInGleam')") + |> should.equal("//erl('1Ok')") } pub fn byte_size_test() { |