diff options
author | Louis Pilfold <louis@lpil.uk> | 2020-06-30 13:21:20 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-06-30 13:21:20 +0100 |
commit | cd9f78320acf2942b5e63cd5370f14f3cce12662 (patch) | |
tree | a59329451db43d2fefb6a3707e1a0bc6696a3497 /src/gleam/bit_string.gleam | |
parent | 1fb3e8e6c69fbd254fdf5ede2dd098746ce35498 (diff) | |
download | gleam_stdlib-cd9f78320acf2942b5e63cd5370f14f3cce12662.tar.gz gleam_stdlib-cd9f78320acf2942b5e63cd5370f14f3cce12662.zip |
bit_string.{to_string, is_utf8}
Diffstat (limited to 'src/gleam/bit_string.gleam')
-rw-r--r-- | src/gleam/bit_string.gleam | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/gleam/bit_string.gleam b/src/gleam/bit_string.gleam index 0bcdc66..5236cf8 100644 --- a/src/gleam/bit_string.gleam +++ b/src/gleam/bit_string.gleam @@ -5,7 +5,7 @@ pub type BitString = BitString -/// Convert a utf8 String type into a raw BitString type. +/// Convert a UTF-8 String type into a raw BitString type. /// pub external fn from_string(String) -> BitString = "gleam_stdlib" "identity" @@ -52,3 +52,31 @@ pub external fn int_to_u32(Int) -> Result(BitString, Nil) = /// pub external fn int_from_u32(BitString) -> Result(Int, Nil) = "gleam_stdlib" "bit_string_int_from_u32" + +/// Test to see whether a bit string is valid UTF-8. +/// +pub fn is_utf8(bits: BitString) -> Bool { + case bits { + <<>> -> True + <<c:utf8, rest:binary>> -> { + // TODO: https://github.com/gleam-lang/gleam/issues/704 + let _ = c + is_utf8(rest) + } + _ -> False + } +} + +external fn unsafe_to_string(BitString) -> String = + "gleam_stdlib" "identity" + +/// Convert a bit string to a string. +/// +/// Returns an error if the bit string is valid UTF-8 data. +/// +pub fn to_string(bits: BitString) -> Result(String, Nil) { + case is_utf8(bits) { + True -> Ok(unsafe_to_string(bits)) + False -> Error(Nil) + } +} |