aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gleam/base.gleam24
-rw-r--r--src/gleam_stdlib.erl7
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.