Skip to content

Commit adc22ad

Browse files
committed
feat: Fixed 16 byte encodings
Useful especially for encoding UUID values
1 parent f6d3960 commit adc22ad

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

src/types.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,28 @@ impl State {
510510
Ok(value)
511511
}
512512

513+
/// Preencode a fixed 16 byte buffer
514+
pub fn preencode_fixed_16(&mut self) -> Result<usize, EncodingError> {
515+
self.add_end(16)
516+
}
517+
518+
/// Encode a fixed 16 byte buffer
519+
pub fn encode_fixed_16(
520+
&mut self,
521+
value: &[u8],
522+
buffer: &mut [u8],
523+
) -> Result<usize, EncodingError> {
524+
self.set_slice_to_buffer_fixed(value, buffer, 16)
525+
}
526+
527+
/// Decode a fixed 16 byte buffer
528+
pub fn decode_fixed_16(&mut self, buffer: &[u8]) -> Result<Box<[u8]>, EncodingError> {
529+
let range = self.validate(16, buffer)?;
530+
let value = buffer[range].to_vec().into_boxed_slice();
531+
self.add_start(16)?;
532+
Ok(value)
533+
}
534+
513535
/// Preencode a fixed 32 byte buffer
514536
pub fn preencode_fixed_32(&mut self) -> Result<usize, EncodingError> {
515537
self.add_end(32)

tests/generic.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,22 +176,27 @@ fn cenc_string_array() -> Result<(), EncodingError> {
176176

177177
#[test]
178178
fn cenc_fixed_and_raw() -> Result<(), EncodingError> {
179-
let buf_value_1: Vec<u8> = vec![0xFF; 32];
180-
let buf_value_2: Vec<u8> = vec![0xFF, 0x11, 0x99];
179+
let buf_value_1: Vec<u8> = vec![0xEE; 16];
180+
let buf_value_2: Vec<u8> = vec![0xFF; 32];
181+
let buf_value_3: Vec<u8> = vec![0xFF, 0x11, 0x99];
181182
let mut enc_state = State::new();
183+
enc_state.preencode_fixed_16()?;
182184
enc_state.preencode_fixed_32()?;
183-
enc_state.preencode_raw_buffer(&buf_value_2)?;
185+
enc_state.preencode_raw_buffer(&buf_value_3)?;
184186
let mut buffer = enc_state.create_buffer();
185-
// 32 bytes for data
187+
// 16 + 32 bytes for data
186188
// 3 bytes for data
187-
assert_eq!(buffer.len(), 32 + 3);
188-
enc_state.encode_fixed_32(&buf_value_1, &mut buffer)?;
189-
enc_state.encode_raw_buffer(&buf_value_2, &mut buffer)?;
189+
assert_eq!(buffer.len(), 16 + 32 + 3);
190+
enc_state.encode_fixed_16(&buf_value_1, &mut buffer)?;
191+
enc_state.encode_fixed_32(&buf_value_2, &mut buffer)?;
192+
enc_state.encode_raw_buffer(&buf_value_3, &mut buffer)?;
190193
let mut dec_state = State::from_buffer(&buffer);
191-
let buf_value_1_ret: Vec<u8> = dec_state.decode_fixed_32(&buffer)?.to_vec();
192-
let buf_value_2_ret: Vec<u8> = dec_state.decode_raw_buffer(&buffer)?;
194+
let buf_value_1_ret: Vec<u8> = dec_state.decode_fixed_16(&buffer)?.to_vec();
195+
let buf_value_2_ret: Vec<u8> = dec_state.decode_fixed_32(&buffer)?.to_vec();
196+
let buf_value_3_ret: Vec<u8> = dec_state.decode_raw_buffer(&buffer)?;
193197
assert_eq!(buf_value_1, buf_value_1_ret);
194198
assert_eq!(buf_value_2, buf_value_2_ret);
199+
assert_eq!(buf_value_3, buf_value_3_ret);
195200
Ok(())
196201
}
197202

0 commit comments

Comments
 (0)