diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/base.gleam | 24 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 7 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/gleam/base.gleam b/src/gleam/base.gleam new file mode 100644 index 0000000..8958184 --- /dev/null +++ b/src/gleam/base.gleam @@ -0,0 +1,24 @@ +import gleam/bit_string.{BitString} +import gleam/string + +external fn erl_encode64(BitString) -> String = + "base64" "encode" + +external fn erl_decode64(String) -> Result(BitString, Nil) = + "gleam_stdlib" "base_decoded4" + +pub fn encode64(input: BitString, padding: Bool) -> String { + let encoded = erl_encode64(input) + case padding { + True -> encoded + False -> string.replace(encoded, "=", "") + } +} + +pub fn decode64(encoded: String) -> Result(BitString, Nil) { + let padded = case bit_string.byte_size(bit_string.from_string(encoded)) % 4 { + 0 -> encoded + n -> string.append(encoded, string.repeat("=", 4 - n)) + } + erl_decode64(padded) +} diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index f0adbd0..47fbdb5 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -11,7 +11,7 @@ string_pad/4, decode_tuple2/1, decode_map/1, bit_string_int_to_u32/1, bit_string_int_from_u32/1, bit_string_append/2, bit_string_part_/3, decode_bit_string/1, regex_from_string/1, regex_from_string_with/2, - regex_match/2]). + regex_match/2, base_decoded4/1]). should_equal(Actual, Expected) -> ?assertEqual(Expected, Actual). should_not_equal(Actual, Expected) -> ?assertNotEqual(Expected, Actual). @@ -189,3 +189,8 @@ regex_match(Regex, String) -> {match, _} -> true; _ -> false end. + +base_decoded4(S) -> + try {ok, base64:decode(S)} catch + error:badarith -> {error, nil} + end. |