Skip to content

Commit 327aefe

Browse files
author
tac0turtle
committed
make no_std work
1 parent d746f16 commit 327aefe

File tree

5 files changed

+67
-40
lines changed

5 files changed

+67
-40
lines changed

Cargo.lock

Lines changed: 22 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ prost = { version = "0.14", default-features = false, features = ["derive"] }
1414
prost-build = "0.14"
1515
prost-types = { version = "0.14", default-features = false }
1616
tonic = { version = "0.14", features = ["transport", "tls-native-roots"] }
17-
tonic-prost = "0.14"
17+
tonic-prost = { version = "0.14", default-features = false }
1818
tonic-prost-build = "0.14"
1919
walkdir = "2.5.0"

client/crates/types/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ categories = ["api-bindings", "encoding"]
1313

1414
[features]
1515
default = ["std", "grpc", "compression"]
16-
std = ["prost/std", "prost-types/std", "bytes?/std"]
17-
compression = ["std", "bytes", "thiserror", "ruzstd"]
18-
grpc = ["tonic", "std"] # Enable gRPC support (both client and server code are always generated)
16+
std = ["prost/std", "prost-types/std", "bytes?/std", "snafu?/std", "ruzstd?/std"]
17+
compression = ["bytes", "snafu", "ruzstd"]
18+
grpc = ["tonic", "tonic-prost", "std"] # Enable gRPC support (both client and server code are always generated)
1919

2020
[build-dependencies]
2121
tonic-prost-build = { workspace = true }
@@ -26,8 +26,8 @@ walkdir = { workspace = true }
2626
prost = { workspace = true }
2727
prost-types = { workspace = true }
2828
tonic = { workspace = true, optional = true, features = ["transport"] }
29-
tonic-prost = { workspace = true }
29+
tonic-prost = { workspace = true, optional = true }
3030

3131
bytes = { version = "1.5", optional = true, default-features = false }
32-
thiserror = { version = "1.0", optional = true }
33-
ruzstd = { version = "0.8.1", optional = true }
32+
snafu = { version = "0.8", optional = true, default-features = false }
33+
ruzstd = { version = "0.8.1", optional = true, default-features = false }

client/crates/types/src/compression.rs

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,16 @@
66
77
use bytes::Bytes;
88
use ruzstd::decoding::StreamingDecoder;
9+
use snafu::Snafu;
10+
11+
#[cfg(not(feature = "std"))]
12+
use alloc::{format, string::{String, ToString}, vec::Vec};
13+
14+
#[cfg(not(feature = "std"))]
15+
use ruzstd::io::Read;
16+
17+
#[cfg(feature = "std")]
918
use std::io::Read;
10-
use thiserror::Error;
1119

1220
/// Size of the compression header in bytes (1 byte flag + 8 bytes original size)
1321
const COMPRESSION_HEADER_SIZE: usize = 9;
@@ -19,20 +27,20 @@ const FLAG_UNCOMPRESSED: u8 = 0x00;
1927
const FLAG_ZSTD: u8 = 0x01;
2028

2129
/// Compression-related errors
22-
#[derive(Debug, Error)]
30+
#[derive(Debug, Snafu)]
2331
pub enum CompressionError {
24-
#[error("invalid compression header")]
32+
#[snafu(display("invalid compression header"))]
2533
InvalidHeader,
2634

27-
#[error("invalid compression flag: {0}")]
28-
InvalidCompressionFlag(u8),
35+
#[snafu(display("invalid compression flag: {flag}"))]
36+
InvalidCompressionFlag { flag: u8 },
2937

30-
#[error("decompression failed: {0}")]
31-
DecompressionFailed(String),
38+
#[snafu(display("decompression failed: {message}"))]
39+
DecompressionFailed { message: String },
3240
}
3341

3442
/// Result type for compression operations
35-
pub type Result<T> = std::result::Result<T, CompressionError>;
43+
pub type Result<T> = core::result::Result<T, CompressionError>;
3644

3745
/// Information about a compressed blob
3846
#[derive(Debug, Clone)]
@@ -65,7 +73,7 @@ fn parse_compression_header(blob: &[u8]) -> Result<(u8, u64, &[u8])> {
6573

6674
// Validate the compression flag
6775
if flag != FLAG_UNCOMPRESSED && flag != FLAG_ZSTD {
68-
return Err(CompressionError::InvalidCompressionFlag(flag));
76+
return Err(CompressionError::InvalidCompressionFlag { flag });
6977
}
7078

7179
Ok((flag, original_size, payload))
@@ -99,7 +107,7 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
99107
}
100108

101109
// Otherwise, it's likely a corrupted compressed blob
102-
return Err(CompressionError::InvalidCompressionFlag(flag));
110+
return Err(CompressionError::InvalidCompressionFlag { flag });
103111
}
104112

105113
// Parse the header
@@ -112,28 +120,35 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
112120
}
113121
FLAG_ZSTD => {
114122
// Decompress with ruzstd
115-
let mut decoder = StreamingDecoder::new(payload)
116-
.map_err(|e| CompressionError::DecompressionFailed(e.to_string()))?;
123+
let mut decoder = StreamingDecoder::new(payload).map_err(|e| {
124+
CompressionError::DecompressionFailed {
125+
message: format!("{}", e),
126+
}
127+
})?;
117128

118129
let mut decompressed = Vec::new();
119-
decoder
120-
.read_to_end(&mut decompressed)
121-
.map_err(|e| CompressionError::DecompressionFailed(e.to_string()))?;
130+
decoder.read_to_end(&mut decompressed).map_err(|e| {
131+
CompressionError::DecompressionFailed {
132+
message: format!("{}", e),
133+
}
134+
})?;
122135

123136
// Verify the decompressed size matches
124137
if decompressed.len() as u64 != original_size {
125-
return Err(CompressionError::DecompressionFailed(format!(
126-
"size mismatch: expected {}, got {}",
127-
original_size,
128-
decompressed.len()
129-
)));
138+
return Err(CompressionError::DecompressionFailed {
139+
message: format!(
140+
"size mismatch: expected {}, got {}",
141+
original_size,
142+
decompressed.len()
143+
),
144+
});
130145
}
131146

132147
Ok(Bytes::from(decompressed))
133148
}
134149
_ => {
135150
// Should not happen as we validated the flag earlier
136-
Err(CompressionError::InvalidCompressionFlag(flag))
151+
Err(CompressionError::InvalidCompressionFlag { flag })
137152
}
138153
}
139154
}
@@ -216,7 +231,7 @@ mod tests {
216231
assert!(result.is_err());
217232

218233
match result.unwrap_err() {
219-
CompressionError::InvalidCompressionFlag(flag) => {
234+
CompressionError::InvalidCompressionFlag { flag } => {
220235
assert_eq!(flag, 0xFF);
221236
}
222237
_ => panic!("Expected InvalidCompressionFlag error"),

client/crates/types/tests/compression_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn test_invalid_compression_flag() {
2323
let result = decompress_blob(&invalid_blob);
2424
assert!(result.is_err());
2525

26-
if let Err(CompressionError::InvalidCompressionFlag(flag)) = result {
26+
if let Err(CompressionError::InvalidCompressionFlag { flag }) = result {
2727
assert_eq!(flag, 0xFF);
2828
} else {
2929
panic!("Expected InvalidCompressionFlag error");

0 commit comments

Comments
 (0)