diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-09-09 20:30:04 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-09-09 20:30:04 +0100 |
commit | 70136ec67863b0c97b9845edc13c6841eee033fc (patch) | |
tree | 5b0d429aa415ad8321a2d0bdea01b6184f638f56 | |
parent | 749ac8290d1e3d09e2287056f618d6df91f4e01b (diff) | |
download | gleam_stdlib-70136ec67863b0c97b9845edc13c6841eee033fc.tar.gz gleam_stdlib-70136ec67863b0c97b9845edc13c6841eee033fc.zip |
JS dynamic bit string
-rw-r--r-- | src/gleam/dynamic.gleam | 33 | ||||
-rw-r--r-- | src/gleam_stdlib.js | 9 | ||||
-rw-r--r-- | test/gleam/dynamic_test.gleam | 49 |
3 files changed, 59 insertions, 32 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam index 86d1b6e..903341a 100644 --- a/src/gleam/dynamic.gleam +++ b/src/gleam/dynamic.gleam @@ -60,22 +60,31 @@ if javascript { "../gleam_stdlib.js" "identity" } +/// Checks to see whether a Dynamic value is a bit_string, and return the bit_string if +/// it is. +/// +/// ## Examples +/// +/// > bit_string(from("Hello")) == bit_string.from_string("Hello") +/// True +/// +/// > bit_string(from(123)) +/// Error(DecodeError(expected: "BitString", found: "Int")) +/// +pub fn bit_string(from data: Dynamic) -> Result(BitString, DecodeError) { + decode_bit_string(data) +} + if erlang { - /// Checks to see whether a Dynamic value is a bit_string, and return the bit_string if - /// it is. - /// - /// ## Examples - /// - /// > bit_string(from("Hello")) == bit_string.from_string("Hello") - /// True - /// - /// > bit_string(from(123)) - /// Error(DecodeError(expected: "BitString", found: "Int")) - /// - pub external fn bit_string(from: Dynamic) -> Result(BitString, DecodeError) = + external fn decode_bit_string(Dynamic) -> Result(BitString, DecodeError) = "gleam_stdlib" "decode_bit_string" } +if javascript { + external fn decode_bit_string(Dynamic) -> Result(BitString, DecodeError) = + "../gleam_stdlib.js" "decode_bit_string" +} + /// Checks to see whether a Dynamic value is a string, and return the string if /// it is. /// diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js index b8feecf..0982f62 100644 --- a/src/gleam_stdlib.js +++ b/src/gleam_stdlib.js @@ -476,6 +476,8 @@ function classify_dynamic(data) { return "List"; } else if (Number.isInteger(data)) { return "Int"; + } else if (BitString.isBitString(data)) { + return "BitString"; } else if (typeof data === "number") { return "Float"; } else { @@ -501,6 +503,13 @@ export function decode_int(data) { export function decode_float(data) { return typeof data === "number" ? new Ok(data) : decoder_error("Float", data); } + export function decode_bool(data) { return typeof data === "boolean" ? new Ok(data) : decoder_error("Bool", data); } + +export function decode_bit_string(data) { + return BitString.isBitString(data) + ? new Ok(data) + : decoder_error("BitString", data); +} diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam index 3229e3d..c65f98c 100644 --- a/test/gleam/dynamic_test.gleam +++ b/test/gleam/dynamic_test.gleam @@ -1,38 +1,42 @@ import gleam/should import gleam/dynamic.{DecodeError} +import gleam/bit_string if erlang { - import gleam/bit_string import gleam/list import gleam/result import gleam/map import gleam/option.{None, Some} +} - pub fn bit_string_test() { - "" - |> dynamic.from - |> dynamic.bit_string - |> should.equal(Ok(<<"":utf8>>)) +pub fn bit_string_test() { + <<>> + |> dynamic.from + |> dynamic.bit_string + |> should.equal(Ok(<<>>)) - "Hello" - |> dynamic.from - |> dynamic.bit_string - |> should.equal(Ok(<<"Hello":utf8>>)) + <<"Hello":utf8>> + |> dynamic.from + |> dynamic.bit_string + |> should.equal(Ok(<<"Hello":utf8>>)) - <<65535:16>> - |> dynamic.from - |> dynamic.bit_string - |> should.equal(Ok(<<65535:16>>)) + 1 + |> dynamic.from + |> dynamic.bit_string + |> should.equal(Error(DecodeError(expected: "BitString", found: "Int"))) - 1 - |> dynamic.from - |> dynamic.bit_string - |> should.equal(Error(DecodeError(expected: "BitString", found: "Int"))) + [] + |> dynamic.from + |> dynamic.bit_string + |> should.equal(Error(DecodeError(expected: "BitString", found: "List"))) +} - [] +if erlang { + pub fn bit_string_erlang_test() { + <<65535:16>> |> dynamic.from |> dynamic.bit_string - |> should.equal(Error(DecodeError(expected: "BitString", found: "List"))) + |> should.equal(Ok(<<65535:16>>)) } } @@ -82,6 +86,11 @@ pub fn int_test() { |> dynamic.from |> dynamic.int |> should.equal(Error(DecodeError(expected: "Int", found: "List"))) + + <<1>> + |> dynamic.from + |> dynamic.int + |> should.equal(Error(DecodeError(expected: "Int", found: "BitString"))) } pub fn float_test() { |