diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/bit_string.gleam | 30 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 4 |
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. |