refactor(cli): move decompression status action policy to Rust
The decompression callback in fileio used to classify result statuses and select its display action with a C switch. That left scalar result policy in the C frontend even though Rust already owns the decompression dispatch and result classification, and it coupled the C callback to a diagnostic enum. Rust now exposes an ABI-checked status-action classifier. It keeps the original action ordering and preserves silent handling for statuses that have no display diagnostic, while the C callback retains the exact diagnostic strings, source-name formatting, and display operation. Invalid inputs map to a silent fallback action so the public callback remains behavior-compatible. Focused Rust tests cover every status class, invalid values, and the exported ABI result. Test Plan: - `git diff --cached --check` -- passed - `rustfmt --edition 2021 --check rust/src/fileio_asyncio.rs` -- passed - Full capped Rust/native verification remains pending until the parallel compression and decompression seams are integrated.
This commit is contained in:
+66
-41
@@ -56,13 +56,14 @@ pub const FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT: c_int = 8;
|
||||
pub const FIO_RUST_DECOMPRESS_PASS_THROUGH_ERROR: c_int = 9;
|
||||
pub const FIO_RUST_DECOMPRESS_ZSTD_UNSUPPORTED: c_int = 10;
|
||||
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_NONE: c_int = 0;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_EMPTY_INPUT: c_int = 1;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_SHORT_INPUT: c_int = 2;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED: c_int = 3;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED: c_int = 4;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED: c_int = 5;
|
||||
pub const FIO_RUST_DECOMPRESS_DIAGNOSTIC_UNSUPPORTED_FORMAT: c_int = 6;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_NOOP: c_int = 0;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_EMPTY_INPUT: c_int = 1;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_SHORT_INPUT: c_int = 2;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_GZIP_UNSUPPORTED: c_int = 3;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_LZMA_UNSUPPORTED: c_int = 4;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_LZ4_UNSUPPORTED: c_int = 5;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_UNSUPPORTED_FORMAT: c_int = 6;
|
||||
pub const FIO_RUST_DECOMPRESS_ACTION_INVALID: c_int = 7;
|
||||
|
||||
/// Resolves the legacy automatic pass-through mode without touching the
|
||||
/// destination name or any C-owned file state. Explicit values are returned
|
||||
@@ -89,22 +90,32 @@ pub extern "C" fn FIO_rust_decompressPassThroughPolicy(
|
||||
decompress_pass_through_policy(pass_through, overwrite, destination_is_stdout)
|
||||
}
|
||||
|
||||
/// Maps decompression results to the diagnostics that the C CLI displays.
|
||||
/// Statuses without a legacy diagnostic deliberately map to `NONE`, retaining
|
||||
/// the previous C callback's silent default case.
|
||||
#[no_mangle]
|
||||
pub extern "C" fn FIO_rust_decompressStatusDiagnostic(status: c_int) -> c_int {
|
||||
/// Maps decompression results to the scalar actions consumed by the C CLI.
|
||||
/// Rust owns this status policy; C retains the exact diagnostics, source-name
|
||||
/// handling, and display operations for the returned action.
|
||||
#[inline]
|
||||
fn decompress_status_action(status: c_int) -> c_int {
|
||||
match status {
|
||||
FIO_RUST_DECOMPRESS_EMPTY_INPUT => FIO_RUST_DECOMPRESS_DIAGNOSTIC_EMPTY_INPUT,
|
||||
FIO_RUST_DECOMPRESS_SHORT_INPUT => FIO_RUST_DECOMPRESS_DIAGNOSTIC_SHORT_INPUT,
|
||||
FIO_RUST_DECOMPRESS_GZIP_UNSUPPORTED => FIO_RUST_DECOMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_LZMA_UNSUPPORTED => FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_LZ4_UNSUPPORTED => FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT => FIO_RUST_DECOMPRESS_DIAGNOSTIC_UNSUPPORTED_FORMAT,
|
||||
_ => FIO_RUST_DECOMPRESS_DIAGNOSTIC_NONE,
|
||||
FIO_RUST_DECOMPRESS_EMPTY_INPUT => FIO_RUST_DECOMPRESS_ACTION_EMPTY_INPUT,
|
||||
FIO_RUST_DECOMPRESS_SHORT_INPUT => FIO_RUST_DECOMPRESS_ACTION_SHORT_INPUT,
|
||||
FIO_RUST_DECOMPRESS_GZIP_UNSUPPORTED => FIO_RUST_DECOMPRESS_ACTION_GZIP_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_LZMA_UNSUPPORTED => FIO_RUST_DECOMPRESS_ACTION_LZMA_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_LZ4_UNSUPPORTED => FIO_RUST_DECOMPRESS_ACTION_LZ4_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT => FIO_RUST_DECOMPRESS_ACTION_UNSUPPORTED_FORMAT,
|
||||
FIO_RUST_DECOMPRESS_OK
|
||||
| FIO_RUST_DECOMPRESS_PASS_THROUGH
|
||||
| FIO_RUST_DECOMPRESS_FRAME_ERROR
|
||||
| FIO_RUST_DECOMPRESS_PASS_THROUGH_ERROR
|
||||
| FIO_RUST_DECOMPRESS_ZSTD_UNSUPPORTED => FIO_RUST_DECOMPRESS_ACTION_NOOP,
|
||||
_ => FIO_RUST_DECOMPRESS_ACTION_INVALID,
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn FIO_rust_decompressStatusAction(status: c_int) -> c_int {
|
||||
decompress_status_action(status)
|
||||
}
|
||||
|
||||
type FIO_rust_frame_progress_fn = Option<unsafe extern "C" fn(*mut c_void, *const c_char, u64)>;
|
||||
pub type FIO_rust_decompress_frame_fn =
|
||||
unsafe extern "C" fn(*mut c_void, *const c_char, u64, *mut u64, *mut usize, c_int) -> c_int;
|
||||
@@ -5344,48 +5355,62 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decompression_status_diagnostic_preserves_cli_mapping() {
|
||||
for (status, diagnostic) in [
|
||||
fn decompression_status_action_preserves_cli_mapping_and_abi() {
|
||||
for (status, action) in [
|
||||
(FIO_RUST_DECOMPRESS_OK, FIO_RUST_DECOMPRESS_ACTION_NOOP),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_PASS_THROUGH,
|
||||
FIO_RUST_DECOMPRESS_ACTION_NOOP,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_EMPTY_INPUT,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_EMPTY_INPUT,
|
||||
FIO_RUST_DECOMPRESS_ACTION_EMPTY_INPUT,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_SHORT_INPUT,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_SHORT_INPUT,
|
||||
FIO_RUST_DECOMPRESS_ACTION_SHORT_INPUT,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_GZIP_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_ACTION_GZIP_UNSUPPORTED,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_LZMA_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_ACTION_LZMA_UNSUPPORTED,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_LZ4_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_ACTION_LZ4_UNSUPPORTED,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT,
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_UNSUPPORTED_FORMAT,
|
||||
FIO_RUST_DECOMPRESS_ACTION_UNSUPPORTED_FORMAT,
|
||||
),
|
||||
] {
|
||||
assert_eq!(FIO_rust_decompressStatusDiagnostic(status), diagnostic);
|
||||
}
|
||||
|
||||
for status in [
|
||||
FIO_RUST_DECOMPRESS_OK,
|
||||
FIO_RUST_DECOMPRESS_PASS_THROUGH,
|
||||
FIO_RUST_DECOMPRESS_FRAME_ERROR,
|
||||
FIO_RUST_DECOMPRESS_PASS_THROUGH_ERROR,
|
||||
FIO_RUST_DECOMPRESS_ZSTD_UNSUPPORTED,
|
||||
-1,
|
||||
99,
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_FRAME_ERROR,
|
||||
FIO_RUST_DECOMPRESS_ACTION_NOOP,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_PASS_THROUGH_ERROR,
|
||||
FIO_RUST_DECOMPRESS_ACTION_NOOP,
|
||||
),
|
||||
(
|
||||
FIO_RUST_DECOMPRESS_ZSTD_UNSUPPORTED,
|
||||
FIO_RUST_DECOMPRESS_ACTION_NOOP,
|
||||
),
|
||||
(-1, FIO_RUST_DECOMPRESS_ACTION_INVALID),
|
||||
(11, FIO_RUST_DECOMPRESS_ACTION_INVALID),
|
||||
(c_int::MAX, FIO_RUST_DECOMPRESS_ACTION_INVALID),
|
||||
] {
|
||||
assert_eq!(
|
||||
FIO_rust_decompressStatusDiagnostic(status),
|
||||
FIO_RUST_DECOMPRESS_DIAGNOSTIC_NONE
|
||||
decompress_status_action(status),
|
||||
action,
|
||||
"unexpected action for decompression status {status}"
|
||||
);
|
||||
assert_eq!(
|
||||
FIO_rust_decompressStatusAction(status),
|
||||
action,
|
||||
"C ABI disagrees for decompression status {status}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user