Merge pull request #7321 from shua/fromutf8

DO NOT MERGE update Str.fromUtf8 error type
This commit is contained in:
Luke Boswell 2025-01-08 07:56:40 +11:00 committed by GitHub
commit 8540aa1a14
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 105 additions and 105 deletions

View file

@ -538,14 +538,14 @@ toUtf8 : Str -> List U8
## expect Str.fromUtf8 [] == Ok "" ## expect Str.fromUtf8 [] == Ok ""
## expect Str.fromUtf8 [255] |> Result.isErr ## expect Str.fromUtf8 [255] |> Result.isErr
## ``` ## ```
fromUtf8 : List U8 -> Result Str [BadUtf8 Utf8ByteProblem U64] fromUtf8 : List U8 -> Result Str [BadUtf8 { problem : Utf8ByteProblem, index : U64 }]
fromUtf8 = \bytes -> fromUtf8 = \bytes ->
result = fromUtf8Lowlevel bytes result = fromUtf8Lowlevel bytes
if result.cIsOk then if result.cIsOk then
Ok result.bString Ok result.bString
else else
Err (BadUtf8 result.dProblemCode result.aByteIndex) Err (BadUtf8 { problem: result.dProblemCode, index: result.aByteIndex })
expect (Str.fromUtf8 [82, 111, 99]) == Ok "Roc" expect (Str.fromUtf8 [82, 111, 99]) == Ok "Roc"
expect (Str.fromUtf8 [224, 174, 154, 224, 174, 191]) == Ok "சி" expect (Str.fromUtf8 [224, 174, 154, 224, 174, 191]) == Ok "சி"

View file

@ -165,7 +165,7 @@ mod solve_expr {
Str.fromUtf8 Str.fromUtf8
" "
), ),
"List U8 -> Result Str [BadUtf8 Utf8ByteProblem U64]", "List U8 -> Result Str [BadUtf8 { index : U64, problem : Utf8ByteProblem }]",
); );
} }

View file

@ -692,7 +692,7 @@ fn str_from_utf8_fail_invalid_start_byte() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 0x80, 99] is when Str.fromUtf8 [97, 98, 0x80, 99] is
Err (BadUtf8 InvalidStartByte byteIndex) -> Err (BadUtf8 {problem: InvalidStartByte, index: byteIndex}) ->
if byteIndex == 2 then if byteIndex == 2 then
"a" "a"
else else
@ -712,7 +712,7 @@ fn str_from_utf8_fail_unexpected_end_of_sequence() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 99, 0xC2] is when Str.fromUtf8 [97, 98, 99, 0xC2] is
Err (BadUtf8 UnexpectedEndOfSequence byteIndex) -> Err (BadUtf8 {problem: UnexpectedEndOfSequence, index: byteIndex}) ->
if byteIndex == 3 then if byteIndex == 3 then
"a" "a"
else else
@ -732,7 +732,7 @@ fn str_from_utf8_fail_expected_continuation() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 99, 0xC2, 0x00] is when Str.fromUtf8 [97, 98, 99, 0xC2, 0x00] is
Err (BadUtf8 ExpectedContinuation byteIndex) -> Err (BadUtf8 {problem: ExpectedContinuation, index: byteIndex}) ->
if byteIndex == 3 then if byteIndex == 3 then
"a" "a"
else else
@ -752,7 +752,7 @@ fn str_from_utf8_fail_overlong_encoding() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 0xF0, 0x80, 0x80, 0x80] is when Str.fromUtf8 [97, 0xF0, 0x80, 0x80, 0x80] is
Err (BadUtf8 OverlongEncoding byteIndex) -> Err (BadUtf8 {problem: OverlongEncoding, index: byteIndex}) ->
if byteIndex == 1 then if byteIndex == 1 then
"a" "a"
else else
@ -772,7 +772,7 @@ fn str_from_utf8_fail_codepoint_too_large() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 0xF4, 0x90, 0x80, 0x80] is when Str.fromUtf8 [97, 0xF4, 0x90, 0x80, 0x80] is
Err (BadUtf8 CodepointTooLarge byteIndex) -> Err (BadUtf8 {problem: CodepointTooLarge, index: byteIndex}) ->
if byteIndex == 1 then if byteIndex == 1 then
"a" "a"
else else
@ -792,7 +792,7 @@ fn str_from_utf8_fail_surrogate_half() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 0xED, 0xA0, 0x80] is when Str.fromUtf8 [97, 98, 0xED, 0xA0, 0x80] is
Err (BadUtf8 EncodesSurrogateHalf byteIndex) -> Err (BadUtf8 {problem: EncodesSurrogateHalf, index: byteIndex}) ->
if byteIndex == 2 then if byteIndex == 2 then
"a" "a"
else else

View file

@ -522,7 +522,7 @@ fn str_from_utf8_fail_invalid_start_byte() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 0x80, 99] is when Str.fromUtf8 [97, 98, 0x80, 99] is
Err (BadUtf8 InvalidStartByte byteIndex) -> Err (BadUtf8 {problem: InvalidStartByte, index: byteIndex}) ->
if byteIndex == 2 then if byteIndex == 2 then
"a" "a"
else else
@ -541,7 +541,7 @@ fn str_from_utf8_fail_unexpected_end_of_sequence() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 99, 0xC2] is when Str.fromUtf8 [97, 98, 99, 0xC2] is
Err (BadUtf8 UnexpectedEndOfSequence byteIndex) -> Err (BadUtf8 {problem: UnexpectedEndOfSequence, index: byteIndex}) ->
if byteIndex == 3 then if byteIndex == 3 then
"a" "a"
else else
@ -560,7 +560,7 @@ fn str_from_utf8_fail_expected_continuation() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 99, 0xC2, 0x00] is when Str.fromUtf8 [97, 98, 99, 0xC2, 0x00] is
Err (BadUtf8 ExpectedContinuation byteIndex) -> Err (BadUtf8 {problem: ExpectedContinuation, index: byteIndex}) ->
if byteIndex == 3 then if byteIndex == 3 then
"a" "a"
else else
@ -579,7 +579,7 @@ fn str_from_utf8_fail_overlong_encoding() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 0xF0, 0x80, 0x80, 0x80] is when Str.fromUtf8 [97, 0xF0, 0x80, 0x80, 0x80] is
Err (BadUtf8 OverlongEncoding byteIndex) -> Err (BadUtf8 {problem: OverlongEncoding, index: byteIndex}) ->
if byteIndex == 1 then if byteIndex == 1 then
"a" "a"
else else
@ -598,7 +598,7 @@ fn str_from_utf8_fail_codepoint_too_large() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 0xF4, 0x90, 0x80, 0x80] is when Str.fromUtf8 [97, 0xF4, 0x90, 0x80, 0x80] is
Err (BadUtf8 CodepointTooLarge byteIndex) -> Err (BadUtf8 {problem: CodepointTooLarge, index: byteIndex}) ->
if byteIndex == 1 then if byteIndex == 1 then
"a" "a"
else else
@ -617,7 +617,7 @@ fn str_from_utf8_fail_surrogate_half() {
indoc!( indoc!(
r#" r#"
when Str.fromUtf8 [97, 98, 0xED, 0xA0, 0x80] is when Str.fromUtf8 [97, 98, 0xED, 0xA0, 0x80] is
Err (BadUtf8 EncodesSurrogateHalf byteIndex) -> Err (BadUtf8 {problem: EncodesSurrogateHalf, index: byteIndex}) ->
if byteIndex == 2 then if byteIndex == 2 then
"a" "a"
else else

View file

@ -164,31 +164,31 @@ procedure Num.96 (#Attr.2):
ret Num.287; ret Num.287;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.258 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.259 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.258;
procedure Str.36 (#Attr.2):
let Str.259 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.259; ret Str.259;
procedure Str.36 (#Attr.2):
let Str.260 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.260;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.45 : Str = StructAtIndex 1 Str.74; let #Derived_gen.45 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.45; dec #Derived_gen.45;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):

View file

@ -105,31 +105,31 @@ procedure Num.96 (#Attr.2):
ret Num.283; ret Num.283;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.255 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.256 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.255;
procedure Str.36 (#Attr.2):
let Str.256 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.256; ret Str.256;
procedure Str.36 (#Attr.2):
let Str.257 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.257;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.24 : Str = StructAtIndex 1 Str.74; let #Derived_gen.24 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.24; dec #Derived_gen.24;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):

View file

@ -112,31 +112,31 @@ procedure Num.96 (#Attr.2):
ret Num.283; ret Num.283;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.255 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.256 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.255;
procedure Str.36 (#Attr.2):
let Str.256 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.256; ret Str.256;
procedure Str.36 (#Attr.2):
let Str.257 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.257;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.28 : Str = StructAtIndex 1 Str.74; let #Derived_gen.28 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.28; dec #Derived_gen.28;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):

View file

@ -38,31 +38,31 @@ procedure Num.96 (#Attr.2):
ret Num.283; ret Num.283;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.255 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.256 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.255;
procedure Str.36 (#Attr.2):
let Str.256 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.256; ret Str.256;
procedure Str.36 (#Attr.2):
let Str.257 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.257;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.3 : Str = StructAtIndex 1 Str.74; let #Derived_gen.3 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.3; dec #Derived_gen.3;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):

View file

@ -110,31 +110,31 @@ procedure Num.96 (#Attr.2):
ret Num.283; ret Num.283;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.255 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.256 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.255;
procedure Str.36 (#Attr.2):
let Str.256 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.256; ret Str.256;
procedure Str.36 (#Attr.2):
let Str.257 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.257;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.27 : Str = StructAtIndex 1 Str.74; let #Derived_gen.27 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.27; dec #Derived_gen.27;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):

View file

@ -113,31 +113,31 @@ procedure Num.96 (#Attr.2):
ret Num.283; ret Num.283;
procedure Str.12 (#Attr.2): procedure Str.12 (#Attr.2):
let Str.255 : List U8 = lowlevel StrToUtf8 #Attr.2; let Str.256 : List U8 = lowlevel StrToUtf8 #Attr.2;
ret Str.255;
procedure Str.36 (#Attr.2):
let Str.256 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.256; ret Str.256;
procedure Str.36 (#Attr.2):
let Str.257 : U64 = lowlevel StrCountUtf8Bytes #Attr.2;
ret Str.257;
procedure Str.43 (#Attr.2): procedure Str.43 (#Attr.2):
let Str.253 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2; let Str.254 : {U64, Str, Int1, U8} = lowlevel StrFromUtf8 #Attr.2;
ret Str.253; ret Str.254;
procedure Str.9 (Str.73): procedure Str.9 (Str.73):
let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73; let Str.74 : {U64, Str, Int1, U8} = CallByName Str.43 Str.73;
let Str.250 : Int1 = StructAtIndex 2 Str.74; let Str.251 : Int1 = StructAtIndex 2 Str.74;
if Str.250 then if Str.251 then
let Str.252 : Str = StructAtIndex 1 Str.74; let Str.253 : Str = StructAtIndex 1 Str.74;
let Str.251 : [C {U64, U8}, C Str] = TagId(1) Str.252; let Str.252 : [C {U64, U8}, C Str] = TagId(1) Str.253;
ret Str.251; ret Str.252;
else else
let Str.248 : U8 = StructAtIndex 3 Str.74;
let Str.249 : U64 = StructAtIndex 0 Str.74; let Str.249 : U64 = StructAtIndex 0 Str.74;
let Str.250 : U8 = StructAtIndex 3 Str.74;
let #Derived_gen.28 : Str = StructAtIndex 1 Str.74; let #Derived_gen.28 : Str = StructAtIndex 1 Str.74;
dec #Derived_gen.28; dec #Derived_gen.28;
let Str.247 : {U64, U8} = Struct {Str.249, Str.248}; let Str.248 : {U64, U8} = Struct {Str.249, Str.250};
let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.247; let Str.246 : [C {U64, U8}, C Str] = TagId(0) Str.248;
ret Str.246; ret Str.246;
procedure Test.20 (Test.56): procedure Test.20 (Test.56):