cratestack_codec_cbor/
lib.rs1use cratestack_core::{CoolCodec, CoolError};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Default)]
5pub struct CborCodec;
6
7impl CoolCodec for CborCodec {
8 const CONTENT_TYPE: &'static str = "application/cbor";
9
10 fn encode<T: Serialize + ?Sized>(&self, value: &T) -> Result<Vec<u8>, CoolError> {
11 minicbor_serde::to_vec(value)
12 .map_err(|error| CoolError::Codec(format!("failed to encode CBOR body: {error}")))
13 }
14
15 fn decode<T: for<'de> Deserialize<'de>>(&self, bytes: &[u8]) -> Result<T, CoolError> {
16 minicbor_serde::from_slice(bytes)
17 .map_err(|error| CoolError::Codec(format!("failed to decode CBOR body: {error}")))
18 }
19}
20
21#[cfg(test)]
22mod tests {
23 use cratestack_core::CoolCodec;
24
25 use super::CborCodec;
26
27 #[test]
28 fn round_trips_value() {
29 let codec = CborCodec;
30 let bytes = codec
31 .encode(&vec!["cool", "stack"])
32 .expect("encode should succeed");
33 let value: Vec<String> = codec.decode(&bytes).expect("decode should succeed");
34
35 assert_eq!(value, vec!["cool".to_owned(), "stack".to_owned()]);
36 }
37}