refactor(cli): move codec diagnostic mapping to Rust

Move LZMA and LZ4 compression-status classification into Rust while retaining
user-facing diagnostic text, format callbacks, and the existing C ABI boundary.
Unknown statuses continue to select the generic diagnostic path.

Test Plan:
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo +nightly fmt --manifest-path rust/Cargo.toml -- --check
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo clippy --manifest-path rust/Cargo.toml --all-targets -- -D warnings
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml --all-targets (782 passed)
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo clippy --manifest-path rust/cli/Cargo.toml --all-targets -- -D warnings
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/cli/Cargo.toml --all-targets (179 passed)
- ulimit -v 41943040; make -j1
- ulimit -v 41943040; make -j1 -C tests test (all tests completed successfully)
This commit is contained in:
2026-07-20 06:43:54 +02:00
parent f7c04292d4
commit a00ba4c2b7
2 changed files with 157 additions and 14 deletions
+42 -14
View File
@@ -1437,6 +1437,16 @@ enum {
FIO_RUST_LZMA_CODE_ERROR = 4,
FIO_RUST_LZMA_INVALID_PROJECTION = 5
};
enum {
FIO_RUST_LZMA_DIAGNOSTIC_OK = 0,
FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR = 1,
FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR = 2,
FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR = 3,
FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR = 4,
FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION = 5,
FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN = 6
};
int FIO_rust_lzmaCompressionDiagnostic(int status);
typedef void (*FIO_rust_lzma_read_fill_fn)(
void* opaque, size_t requested, const unsigned char** buffer, size_t* loaded);
@@ -1490,6 +1500,16 @@ enum {
FIO_RUST_LZ4_END_ERROR = 4,
FIO_RUST_LZ4_INVALID_PROJECTION = 5
};
enum {
FIO_RUST_LZ4_DIAGNOSTIC_OK = 0,
FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR = 1,
FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR = 2,
FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR = 3,
FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR = 4,
FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION = 5,
FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN = 6
};
int FIO_rust_lz4CompressionDiagnostic(int status);
typedef int (*FIO_rust_lz4_create_fn)(void* opaque, unsigned version,
size_t* result);
@@ -2145,6 +2165,7 @@ FIO_compressLzmaFrame(cRess_t* ress,
U64 compressedSize = 0;
int lzmaResult = (int)LZMA_OK;
int status;
int diagnostic;
memset(&projection, 0, sizeof(projection));
projection.readOpaque = (void*)ress->readCtx;
@@ -2166,19 +2187,22 @@ FIO_compressLzmaFrame(cRess_t* ress,
status = FIO_rust_compressLzmaFrame(
&projection, srcFileName, srcFileSize, compressionLevel, plain_lzma,
readsize, &compressedSize, &lzmaResult);
switch (status) {
case FIO_RUST_LZMA_OK:
diagnostic = FIO_rust_lzmaCompressionDiagnostic(status);
switch (diagnostic) {
case FIO_RUST_LZMA_DIAGNOSTIC_OK:
return compressedSize;
case FIO_RUST_LZMA_INIT_PRESET_ERROR:
case FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR:
EXM_THROW(81, "zstd: %s: lzma_lzma_preset error", srcFileName);
case FIO_RUST_LZMA_INIT_ALONE_ERROR:
case FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR:
EXM_THROW(82, "zstd: %s: lzma_alone_encoder error %d", srcFileName, lzmaResult);
case FIO_RUST_LZMA_INIT_XZ_ERROR:
case FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR:
EXM_THROW(83, "zstd: %s: lzma_easy_encoder error %d", srcFileName, lzmaResult);
case FIO_RUST_LZMA_CODE_ERROR:
case FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR:
EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult);
case FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION:
EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult);
default:
assert(status == FIO_RUST_LZMA_INVALID_PROJECTION);
assert(diagnostic == FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN);
EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult);
}
}
@@ -2341,6 +2365,7 @@ FIO_compressLz4Frame(cRess_t* ress,
U64 compressedSize = 0;
size_t lz4Result = 0;
int status;
int diagnostic;
memset(&codec, 0, sizeof(codec));
memset(&projection, 0, sizeof(projection));
@@ -2367,22 +2392,25 @@ FIO_compressLz4Frame(cRess_t* ress,
status = FIO_rust_compressLz4Frame(
&projection, srcFileName, srcFileSize, compressionLevel, checksumFlag,
readsize, &compressedSize, &lz4Result);
switch (status) {
case FIO_RUST_LZ4_OK:
diagnostic = FIO_rust_lz4CompressionDiagnostic(status);
switch (diagnostic) {
case FIO_RUST_LZ4_DIAGNOSTIC_OK:
return compressedSize;
case FIO_RUST_LZ4_CREATE_ERROR:
case FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR:
EXM_THROW(31, "zstd: failed to create lz4 compression context");
case FIO_RUST_LZ4_HEADER_ERROR:
case FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR:
EXM_THROW(33, "File header generation failed : %s",
LZ4F_getErrorName(lz4Result));
case FIO_RUST_LZ4_UPDATE_ERROR:
case FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR:
EXM_THROW(35, "zstd: %s: lz4 compression failed : %s",
srcFileName, LZ4F_getErrorName(lz4Result));
case FIO_RUST_LZ4_END_ERROR:
case FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR:
EXM_THROW(38, "zstd: %s: lz4 end of file generation failed : %s",
srcFileName, LZ4F_getErrorName(lz4Result));
case FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION:
EXM_THROW(31, "zstd: failed to create lz4 compression context");
default:
assert(status == FIO_RUST_LZ4_INVALID_PROJECTION);
assert(diagnostic == FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN);
EXM_THROW(31, "zstd: failed to create lz4 compression context");
}
}