aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2020-06-30 13:21:20 +0100
committerLouis Pilfold <louis@lpil.uk>2020-06-30 13:21:20 +0100
commitcd9f78320acf2942b5e63cd5370f14f3cce12662 (patch)
treea59329451db43d2fefb6a3707e1a0bc6696a3497 /src
parent1fb3e8e6c69fbd254fdf5ede2dd098746ce35498 (diff)
downloadgleam_stdlib-cd9f78320acf2942b5e63cd5370f14f3cce12662.tar.gz
gleam_stdlib-cd9f78320acf2942b5e63cd5370f14f3cce12662.zip
bit_string.{to_string, is_utf8}
Diffstat (limited to 'src')
-rw-r--r--src/gleam/bit_string.gleam30
-rw-r--r--src/gleam_stdlib.erl4
2 files changed, 31 insertions, 3 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)
+ }
+}
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index db2f6fd..f84e658 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -202,6 +202,6 @@ regex_scan(Regex, String) ->
end.
base_decoded4(S) ->
- try {ok, base64:decode(S)} catch
- error:badarith -> {error, nil}
+ try {ok, base64:decode(S)}
+ catch error:badarith -> {error, nil}
end.