Skip to content

Commit 38061d5

Browse files
committed
fix: replace deprecated MoonBit try? usage
- Add a private fzip_result helper that captures FzipError-raising calls with try/catch/noraise. - Replace deprecated try? captures in ZIP fallback logic and white-box tests while preserving Result-based assertions. - Keep ZIP64 classic fallback behavior unchanged by using the helper only where a Result value is intentionally inspected. - Validate the migration with moon check --target all, moon test --target all, moon info, and git diff --check.
1 parent bbaf589 commit 38061d5

9 files changed

Lines changed: 320 additions & 294 deletions

src/error.mbt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub(all) enum FzipErrorCode {
4646

4747
///|
4848
/// Write the symbolic error-code name, such as `"InvalidHeader"`.
49-
pub impl Show for FzipErrorCode with output(self, logger) {
49+
pub impl Show for FzipErrorCode with fn output(self, logger) {
5050
match self {
5151
UnexpectedEOF => logger.write_string("UnexpectedEOF")
5252
InvalidBlockType => logger.write_string("InvalidBlockType")
@@ -117,3 +117,12 @@ fn fzip_err(code : FzipErrorCode, msg? : String = "") -> FzipError {
117117
}
118118
FzipError(code~, message~)
119119
}
120+
121+
///|
122+
fn[T] fzip_result(f : () -> T raise FzipError) -> Result[T, FzipError] {
123+
try f() catch {
124+
err => Err(err)
125+
} noraise {
126+
value => Ok(value)
127+
}
128+
}

src/gzip_wbtest.mbt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,15 @@ test "gunzip - rejects ISIZE above max_output_size before allocation" {
9595
let data : FixedArray[Byte] = [b'H', b'i']
9696
let compressed = gzip_sync(data)
9797
w4(compressed, compressed.length() - 4, 1000U)
98-
let result : Result[FixedArray[Byte], FzipError] = try? gunzip_sync(
99-
compressed,
100-
opts={
98+
let result : Result[FixedArray[Byte], FzipError] = fzip_result(() => {
99+
gunzip_sync(compressed, opts={
101100
out: None,
102101
dictionary: None,
103102
max_output_size: 16,
104103
max_input_size: default_max_input_size,
105104
verify_checksum: true,
106-
},
107-
)
105+
})
106+
})
108107
guard result is Err(FzipError(code~, message~)) else {
109108
fail("expected error")
110109
}
@@ -117,9 +116,9 @@ test "gunzip - rejects ISIZE mismatch after successful inflate" {
117116
let data : FixedArray[Byte] = [b'H', b'e', b'l', b'l', b'o']
118117
let compressed = gzip_sync(data)
119118
w4(compressed, compressed.length() - 4, 8U)
120-
let result : Result[FixedArray[Byte], FzipError] = try? gunzip_sync(
121-
compressed,
122-
)
119+
let result : Result[FixedArray[Byte], FzipError] = fzip_result(() => {
120+
gunzip_sync(compressed)
121+
})
123122
guard result is Err(FzipError(code~, message~)) else {
124123
fail("expected error")
125124
}
@@ -252,6 +251,6 @@ test "gunzip - invalid CRC-32 checksum" {
252251
// Corrupt the CRC-32 (last 8 bytes contain CRC-32 and size)
253252
let corrupted = slc(compressed, 0, e=compressed.length())
254253
corrupted[corrupted.length() - 8] = b'\xFF'
255-
let result = try? gunzip_sync(corrupted)
254+
let result = fzip_result(() => gunzip_sync(corrupted))
256255
assert_true(result is Err(_))
257256
}

src/inflate_wbtest.mbt

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -337,14 +337,16 @@ test "inflt/tuple_return/too_small_buf_returns_error" {
337337
let data = FixedArray::make(512, b'A')
338338
let compressed = deflate_sync(data)
339339
let out = FixedArray::make(8, b'\x00')
340-
let result : Result[(FixedArray[Byte], Int), FzipError] = try? inflt(
341-
compressed,
342-
InflateState::new(2),
343-
Some(out),
344-
None,
345-
default_max_input_size,
346-
default_max_input_size,
347-
)
340+
let result : Result[(FixedArray[Byte], Int), FzipError] = fzip_result(() => {
341+
inflt(
342+
compressed,
343+
InflateState::new(2),
344+
Some(out),
345+
None,
346+
default_max_input_size,
347+
default_max_input_size,
348+
)
349+
})
348350
guard result is Err(FzipError(code~, message~)) else {
349351
fail("expected error")
350352
}
@@ -356,7 +358,7 @@ test "inflt/tuple_return/too_small_buf_returns_error" {
356358
test "inflate - corrupted data error" {
357359
// Test error handling with corrupted data
358360
let corrupted = FixedArray::make(10, b'\xff')
359-
let result = try? inflate_sync(corrupted)
361+
let result = fzip_result(() => inflate_sync(corrupted))
360362
assert_true(result is Err(_))
361363
}
362364

@@ -367,16 +369,16 @@ test "inflate - truncated data error" {
367369
let compressed = deflate_sync(data)
368370
// Take only first half of compressed data
369371
let truncated = slc(compressed, 0, e=compressed.length() / 2)
370-
let result = try? inflate_sync(truncated)
372+
let result = fzip_result(() => inflate_sync(truncated))
371373
assert_true(result is Err(_))
372374
}
373375

374376
///|
375377
test "inflate - rejects code length repeat 16 at start" {
376378
let malformed : FixedArray[Byte] = [b'\x05', b'\x00', b'\x02', b'\x00']
377-
let result : Result[FixedArray[Byte], FzipError] = try? inflate_sync(
378-
malformed,
379-
)
379+
let result : Result[FixedArray[Byte], FzipError] = fzip_result(() => {
380+
inflate_sync(malformed)
381+
})
380382
guard result is Err(FzipError(code~, ..)) else { fail("expected error") }
381383
assert_eq(code, InvalidLengthLiteral)
382384
}
@@ -386,9 +388,9 @@ test "inflate - rejects code length repeat overflow" {
386388
let malformed : FixedArray[Byte] = [
387389
b'\x05', b'\x00', b'\x80', b'\xC0', b'\xDF', b'\x1F',
388390
]
389-
let result : Result[FixedArray[Byte], FzipError] = try? inflate_sync(
390-
malformed,
391-
)
391+
let result : Result[FixedArray[Byte], FzipError] = fzip_result(() => {
392+
inflate_sync(malformed)
393+
})
392394
guard result is Err(FzipError(code~, ..)) else { fail("expected error") }
393395
assert_eq(code, InvalidLengthLiteral)
394396
}
@@ -399,11 +401,13 @@ test "inflate - custom max_output_size limit" {
399401
let data = FixedArray::make(1000, b'A')
400402
let compressed = deflate_sync(data)
401403
// Set max_output_size to 500 bytes (less than actual output)
402-
let result = try? inflate_sync(compressed, opts={
403-
out: None,
404-
dictionary: None,
405-
max_output_size: 500,
406-
max_input_size: default_max_input_size,
404+
let result = fzip_result(() => {
405+
inflate_sync(compressed, opts={
406+
out: None,
407+
dictionary: None,
408+
max_output_size: 500,
409+
max_input_size: default_max_input_size,
410+
})
407411
})
408412
assert_true(result is Err(_))
409413
}
@@ -418,11 +422,13 @@ test "inflate - custom max_input_size limit" {
418422
}
419423
let compressed = deflate_sync(data)
420424
// Set max_input_size smaller than compressed size
421-
let result = try? inflate_sync(compressed, opts={
422-
out: None,
423-
dictionary: None,
424-
max_output_size: default_max_output_size,
425-
max_input_size: 100,
425+
let result = fzip_result(() => {
426+
inflate_sync(compressed, opts={
427+
out: None,
428+
dictionary: None,
429+
max_output_size: default_max_output_size,
430+
max_input_size: 100,
431+
})
426432
})
427433
assert_true(result is Err(_))
428434
}
@@ -821,7 +827,7 @@ test "inflt/backref/dict_overlap_then_doubling" {
821827
/// byte 2 = 0x00 (must be present so the 14-bit header refill can complete)
822828
test "inflt/dynamic_huffman/hlit_too_large_f_inf_002" {
823829
let payload : FixedArray[Byte] = [b'\xF5', b'\x00', b'\x00']
824-
let result = try? inflate_sync(payload)
830+
let result = fzip_result(() => inflate_sync(payload))
825831
guard result is Err(FzipError(code~, ..)) else {
826832
fail("expected FzipError for HLIT > 286")
827833
}
@@ -849,7 +855,7 @@ test "inflt/dynamic_huffman/hlit_too_large_f_inf_002" {
849855
/// byte 2 = 0x00
850856
test "inflt/dynamic_huffman/hdist_too_large_f_inf_003" {
851857
let payload : FixedArray[Byte] = [b'\x05', b'\x1E', b'\x00']
852-
let result = try? inflate_sync(payload)
858+
let result = fzip_result(() => inflate_sync(payload))
853859
guard result is Err(FzipError(code~, ..)) else {
854860
fail("expected FzipError for HDIST > 30")
855861
}

src/security_wbtest.mbt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
///|
22
test "security/gzip - empty input" {
33
let empty : FixedArray[Byte] = []
4-
let result = try? gunzip_sync(empty)
4+
let result = fzip_result(() => gunzip_sync(empty))
55
assert_true(result is Err(_))
66
}
77

88
///|
99
test "security/gzip - too short input" {
1010
let short : FixedArray[Byte] = [b'\x1F', b'\x8B']
11-
let result = try? gunzip_sync(short)
11+
let result = fzip_result(() => gunzip_sync(short))
1212
assert_true(result is Err(_))
1313
}
1414

@@ -17,7 +17,7 @@ test "security/gzip - 9 bytes input" {
1717
let short : FixedArray[Byte] = [
1818
b'\x1F', b'\x8B', b'\x08', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
1919
]
20-
let result = try? gunzip_sync(short)
20+
let result = fzip_result(() => gunzip_sync(short))
2121
assert_true(result is Err(_))
2222
}
2323

@@ -28,7 +28,7 @@ test "security/gzip - FNAME flag but truncated" {
2828
b'\x1F', b'\x8B', b'\x08', b'\x08', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
2929
b'\x03',
3030
]
31-
let result = try? gunzip_sync(truncated)
31+
let result = fzip_result(() => gunzip_sync(truncated))
3232
assert_true(result is Err(_))
3333
}
3434

@@ -38,7 +38,7 @@ test "security/gzip - FEXTRA flag but truncated length" {
3838
b'\x1F', b'\x8B', b'\x08', b'\x04', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
3939
b'\x03',
4040
]
41-
let result = try? gunzip_sync(truncated)
41+
let result = fzip_result(() => gunzip_sync(truncated))
4242
assert_true(result is Err(_))
4343
}
4444

@@ -48,7 +48,7 @@ test "security/gzip - FEXTRA length exceeds input" {
4848
b'\x1F', b'\x8B', b'\x08', b'\x04', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
4949
b'\x03', b'\x10', b'\x00',
5050
]
51-
let result = try? gunzip_sync(truncated)
51+
let result = fzip_result(() => gunzip_sync(truncated))
5252
assert_true(result is Err(_))
5353
}
5454

@@ -58,50 +58,50 @@ test "security/gzip - reserved flags rejected" {
5858
b'\x1F', b'\x8B', b'\x08', b'\xE0', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
5959
b'\x03', b'\x03', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
6060
]
61-
let result = try? gunzip_sync(invalid)
61+
let result = fzip_result(() => gunzip_sync(invalid))
6262
assert_true(result is Err(_))
6363
}
6464

6565
///|
6666
test "security/zlib - empty input" {
6767
let empty : FixedArray[Byte] = []
68-
let result = try? unzlib_sync(empty)
68+
let result = fzip_result(() => unzlib_sync(empty))
6969
assert_true(result is Err(_))
7070
}
7171

7272
///|
7373
test "security/zlib - 1 byte input" {
7474
let short : FixedArray[Byte] = [b'\x78']
75-
let result = try? unzlib_sync(short)
75+
let result = fzip_result(() => unzlib_sync(short))
7676
assert_true(result is Err(_))
7777
}
7878

7979
///|
8080
test "security/zlib - header only (no compressed data)" {
8181
// Valid zlib header (0x78 0x9C) but no compressed data or checksum
8282
let short : FixedArray[Byte] = [b'\x78', b'\x9C']
83-
let result = try? unzlib_sync(short)
83+
let result = fzip_result(() => unzlib_sync(short))
8484
assert_true(result is Err(_))
8585
}
8686

8787
///|
8888
test "security/zip - empty input" {
8989
let empty : FixedArray[Byte] = []
90-
let result = try? unzip_sync(empty)
90+
let result = fzip_result(() => unzip_sync(empty))
9191
assert_true(result is Err(_))
9292
}
9393

9494
///|
9595
test "security/zip - too short input" {
9696
let short : FixedArray[Byte] = [b'\x50', b'\x4B', b'\x05', b'\x06']
97-
let result = try? unzip_sync(short)
97+
let result = fzip_result(() => unzip_sync(short))
9898
assert_true(result is Err(_))
9999
}
100100

101101
///|
102102
test "security/zip - unzip_list empty input" {
103103
let empty : FixedArray[Byte] = []
104-
let result = try? unzip_list(empty)
104+
let result = fzip_result(() => unzip_list(empty))
105105
assert_true(result is Err(_))
106106
}
107107

@@ -132,21 +132,21 @@ test "security/decompress - 2 byte input no crash" {
132132
// decompress_sync with exactly 2 bytes should not crash
133133
// (previously accessed data[2] with only length >= 2 check)
134134
let data : FixedArray[Byte] = [b'\x00', b'\x00']
135-
let result = try? decompress_sync(data)
135+
let result = fzip_result(() => decompress_sync(data))
136136
// It's OK if this errors, just shouldn't crash with out-of-bounds
137137
let _ = result
138138
}
139139

140140
///|
141141
test "security/decompress - 1 byte input" {
142142
let data : FixedArray[Byte] = [b'\x00']
143-
let result = try? decompress_sync(data)
143+
let result = fzip_result(() => decompress_sync(data))
144144
let _ = result
145145
}
146146

147147
///|
148148
test "security/decompress - empty input" {
149149
let data : FixedArray[Byte] = []
150-
let result = try? decompress_sync(data)
150+
let result = fzip_result(() => decompress_sync(data))
151151
let _ = result
152152
}

src/string_wbtest.mbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ test "str_to_u8/str_from_u8 roundtrip - mixed byte lengths" {
134134

135135
///|
136136
fn assert_invalid_utf8(data : FixedArray[Byte]) -> Unit raise {
137-
let result = try? str_from_u8(data)
137+
let result = fzip_result(() => str_from_u8(data))
138138
guard result is Err(FzipError(code~, ..)) else {
139139
fail("expected InvalidUTF8 for byte sequence")
140140
}

src/zip.mbt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,9 +1357,9 @@ fn read_central_directory_info(
13571357
msg="ZIP64 sentinel set but no valid ZIP64 locator",
13581358
)
13591359
}
1360-
let z64_result : Result[ZipCdInfo, FzipError] = try? read_zip64_cd_info(
1361-
data, eocd,
1362-
)
1360+
let z64_result : Result[ZipCdInfo, FzipError] = fzip_result(() => {
1361+
read_zip64_cd_info(data, eocd)
1362+
})
13631363
match z64_result {
13641364
Ok(info) => {
13651365
validate_zip64_cd_matches_classic(

0 commit comments

Comments
 (0)