Skip to main content

cratestack_codec_json/
lib.rs

1use cratestack_core::{CoolCodec, CoolError};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Default)]
5pub struct JsonCodec;
6
7impl CoolCodec for JsonCodec {
8    const CONTENT_TYPE: &'static str = "application/json";
9
10    fn encode<T: Serialize + ?Sized>(&self, value: &T) -> Result<Vec<u8>, CoolError> {
11        serde_json::to_vec(value)
12            .map_err(|error| CoolError::Codec(format!("failed to encode JSON body: {error}")))
13    }
14
15    fn decode<T: for<'de> Deserialize<'de>>(&self, bytes: &[u8]) -> Result<T, CoolError> {
16        serde_json::from_slice(bytes)
17            .map_err(|error| CoolError::Codec(format!("failed to decode JSON body: {error}")))
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use cratestack_core::CoolCodec;
24
25    use super::JsonCodec;
26
27    #[test]
28    fn round_trips_value() {
29        let codec = JsonCodec;
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}