aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/base.gleam13
-rw-r--r--test/gleam/base_test.gleam44
2 files changed, 57 insertions, 0 deletions
diff --git a/src/gleam/base.gleam b/src/gleam/base.gleam
index 8958184..0b88734 100644
--- a/src/gleam/base.gleam
+++ b/src/gleam/base.gleam
@@ -22,3 +22,16 @@ pub fn decode64(encoded: String) -> Result(BitString, Nil) {
}
erl_decode64(padded)
}
+
+pub fn url_encode64(input: BitString, padding: Bool) -> String {
+ encode64(input, padding)
+ |> string.replace("+", "-")
+ |> string.replace("/", "_")
+}
+
+pub fn url_decode64(encoded: String) -> Result(BitString, Nil) {
+ encoded
+ |> string.replace("-", "+")
+ |> string.replace("_", "/")
+ |> decode64()
+}
diff --git a/test/gleam/base_test.gleam b/test/gleam/base_test.gleam
index 90fdb2a..3d2b7c6 100644
--- a/test/gleam/base_test.gleam
+++ b/test/gleam/base_test.gleam
@@ -50,3 +50,47 @@ pub fn decode64_test() {
|> base.decode64()
|> should.equal(Error(Nil))
}
+
+pub fn url_encode64_test() {
+ [255, 127, 254, 252]
+ |> list_to_binary()
+ |> base.url_encode64(True)
+ |> should.equal("_3_-_A==")
+
+ [255, 127, 254, 252]
+ |> list_to_binary()
+ |> base.url_encode64(False)
+ |> should.equal("_3_-_A")
+
+ [0, 0, 0]
+ |> list_to_binary()
+ |> base.url_encode64(True)
+ |> should.equal("AAAA")
+
+ []
+ |> list_to_binary()
+ |> base.url_encode64(True)
+ |> should.equal("")
+}
+
+pub fn url_decode64_test() {
+ "_3_-_A=="
+ |> base.url_decode64()
+ |> should.equal(Ok(list_to_binary([255, 127, 254, 252])))
+
+ "_3_-_A"
+ |> base.url_decode64()
+ |> should.equal(Ok(list_to_binary([255, 127, 254, 252])))
+
+ "AAAA"
+ |> base.url_decode64()
+ |> should.equal(Ok(list_to_binary([0, 0, 0])))
+
+ ""
+ |> base.url_decode64()
+ |> should.equal(Ok(list_to_binary([])))
+
+ ")!"
+ |> base.url_decode64()
+ |> should.equal(Error(Nil))
+}