@@ -153,7 +153,7 @@ pub const Variant = enum {
153
153
fn splitAndDecode (allocator : std.mem.Allocator , s : []const u8 ) Error ! struct { std .ArrayList (u8 ), std .ArrayList (u5 ) } {
154
154
// Split at separator and check for two pieces
155
155
156
- const raw_hrp , const raw_data = if (std .mem .indexOfScalar (u8 , s , SEP )) | sep | .{
156
+ const raw_hrp , const raw_data = if (std .mem .lastIndexOfScalar (u8 , s , SEP )) | sep | .{
157
157
s [0.. sep ], s [sep + 1 .. ],
158
158
} else return Error .MissingSeparator ;
159
159
@@ -177,20 +177,27 @@ fn splitAndDecode(allocator: std.mem.Allocator, s: []const u8) Error!struct { st
177
177
var data = std .ArrayList (u5 ).init (allocator );
178
178
errdefer data .deinit ();
179
179
180
+ var it = std .unicode .Utf8View .initUnchecked (raw_data ).iterator ();
180
181
// Check data payload
181
- for ( raw_data ) | c | {
182
+ while ( it . nextCodepoint () ) | c | {
182
183
// Only check if c is in the ASCII range, all invalid ASCII
183
184
// characters have the value -1 in CHARSET_REV (which covers
184
185
// the whole ASCII range) and will be filtered out later.
185
- if (! std . ascii . isAscii ( c ) ) return error .InvalidChar ;
186
+ if (c >= 128 ) return error .InvalidChar ;
186
187
187
- if (std .ascii .isLower (c )) {
188
+ if (switch (c ) {
189
+ 'a' ... 'z' = > true ,
190
+ else = > false ,
191
+ }) {
188
192
switch (case ) {
189
193
.upper = > return Error .MixedCase ,
190
194
.none = > case = .lower ,
191
195
.lower = > {},
192
196
}
193
- } else if (std .ascii .isUpper (c )) {
197
+ } else if (switch (c ) {
198
+ 'A' ... 'Z' = > true ,
199
+ else = > false ,
200
+ }) {
194
201
switch (case ) {
195
202
.lower = > return Error .MixedCase ,
196
203
.none = > case = .upper ,
@@ -531,6 +538,15 @@ test "roundtrip_without_checksum" {
531
538
try std .testing .expectEqualSlices (u5 , data .items , decoded_data .items );
532
539
}
533
540
541
+ test "decode ln" {
542
+ const str = "lnbc10n1pnw2hkzdqqpp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjssp59g4z52329g4z52329g4z52329g4z52329g4z52329g4z52329g4qcqzysc39n3w6zq50y3775yc66mmvt2fe5aa9mzzdnvq5palgyw6j9uu04qnm0g4ftm5ehtm5aulwtuy0hfrtqcdaxcl2r7wz2x4503levlacqswkkem" ;
543
+
544
+ const h , const d , const v = try decode (std .testing .allocator , str );
545
+ _ = v ; // autofix
546
+ defer h .deinit ();
547
+ defer d .deinit ();
548
+ }
549
+
534
550
test "test_hrp_case_decode" {
535
551
const hrp , const data , const variant = try decode (std .testing .allocator , "hrp1qqqq40atq3" );
536
552
defer hrp .deinit ();
0 commit comments