diff options
author | Louis Pilfold <louis@lpil.uk> | 2023-10-31 17:30:02 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-10-31 17:30:02 +0000 |
commit | 8233587e5e9ef1486b029a872e80cb5456d665da (patch) | |
tree | c37406c9d23b2b22c28cb7523f10588d37ccbc95 | |
parent | aa07fd92febf55c9f687d7ffe1ccde92ca0bbb09 (diff) | |
download | gleam_stdlib-8233587e5e9ef1486b029a872e80cb5456d665da.tar.gz gleam_stdlib-8233587e5e9ef1486b029a872e80cb5456d665da.zip |
Correctly print non-byte aligned bit arrays
-rw-r--r-- | src/gleam_stdlib.erl | 24 | ||||
-rw-r--r-- | test/gleam/string_test.gleam | 7 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index 0e2136f..c6b5130 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -390,6 +390,8 @@ inspect(Binary) when is_binary(Binary) -> Segments = [erlang:integer_to_list(X) || <<X>> <= Binary], ["<<", lists:join(", ", Segments), ">>"] end; +inspect(Bits) when is_bitstring(Bits) -> + inspect_bit_array(Bits); inspect(List) when is_list(List) -> case inspect_list(List) of {proper, Elements} -> ["[", Elements, "]"]; @@ -457,6 +459,28 @@ inspect_list([First | Rest]) when is_list(Rest) -> inspect_list([First | ImproperTail]) -> {improper, [inspect(First), <<" | ">>, inspect(ImproperTail)]}. +inspect_bit_array(Bits) -> + Text = inspect_bit_array(Bits, <<"<<">>), + <<Text/binary, ">>">>. + +inspect_bit_array(<<>>, Acc) -> + Acc; +inspect_bit_array(<<X, Rest/bitstring>>, Acc) -> + inspect_bit_array(Rest, append_segment(Acc, erlang:integer_to_binary(X))); +inspect_bit_array(Rest, Acc) -> + Size = bit_size(Rest), + <<X:Size>> = Rest, + X1 = erlang:integer_to_binary(X), + Size1 = erlang:integer_to_binary(Size), + Segment = <<X1/binary, ":size(", Size1/binary, ")">>, + inspect_bit_array(<<>>, append_segment(Acc, Segment)). + +append_segment(<<"<<">>, Segment) -> + <<"<<", Segment/binary>>; +append_segment(Acc, Segment) -> + <<Acc/binary, ", ", Segment/binary>>. + + inspect_maybe_utf8_string(Binary, Acc) -> case Binary of <<>> -> {ok, <<$", Acc/binary, $">>}; diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam index c6b9540..e1e2fcd 100644 --- a/test/gleam/string_test.gleam +++ b/test/gleam/string_test.gleam @@ -1066,6 +1066,13 @@ pub fn inspect_erlang_atom_with_leading_digit_invalid_in_gleam_test() { |> should.equal("atom.create_from_string(\"1Ok\")") } +@target(erlang) +pub fn fifteen_bit_int_test() { + <<2, 3:size(7)>> + |> string.inspect + |> should.equal("<<2, 3:size(7)>>") +} + pub fn byte_size_test() { let assert 0 = string.byte_size("") let assert 1 = string.byte_size("a") |