serde-bytes-repr 0.3.0

Serde adapter for controlling the representation of bytes
Documentation
use serde::{Deserialize, Serialize};
use serde_bytes_repr::ByteFmtDeserializer;

#[test]
fn deserialize_struct_base64() {
    #[derive(Serialize, Deserialize)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    let json = br#"{"bytes":"dGVzdGluZw=="}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new();
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let demo: Demo = Demo::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(demo.bytes).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn deserialize_seq_base64() {
    let json = br#""dGVzdGluZw==""#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new();
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let bytes: serde_bytes::ByteBuf = Deserialize::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(bytes.to_vec()).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn deserialize_struct_hex() {
    #[derive(Serialize, Deserialize)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    let json = br#"{"bytes":"74657374696e67"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let bytefmt_json_de = ByteFmtDeserializer::new_hex(&mut json_de);
    let demo: Demo = Demo::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(demo.bytes).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn serialize_seq_hex() {
    let json = br#""74657374696e67""#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let bytefmt_json_de = ByteFmtDeserializer::new_hex(&mut json_de);
    let bytes: serde_bytes::ByteBuf = Deserialize::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(bytes.to_vec()).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn deserialize_option_base64() {
    #[derive(Serialize, Deserialize)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    #[derive(Serialize, Deserialize)]
    struct OptionWrapper {
        demo: Option<Demo>,
    }

    let json = br#"{"demo":{"bytes":"dGVzdGluZw=="}}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new();
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let option_wrapper: OptionWrapper = OptionWrapper::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(option_wrapper.demo.unwrap().bytes).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn deserialize_option_hex() {
    #[derive(Serialize, Deserialize)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    #[derive(Serialize, Deserialize)]
    struct OptionWrapper {
        demo: Option<Demo>,
    }

    let json = br#"{"demo":{"bytes":"74657374696e67"}}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let bytefmt_json_de = ByteFmtDeserializer::new_hex(&mut json_de);
    let option_wrapper: OptionWrapper = OptionWrapper::deserialize(bytefmt_json_de).unwrap();

    let deserialized = String::from_utf8(option_wrapper.demo.unwrap().bytes).unwrap();
    assert_eq!("testing", deserialized.as_str());
}

#[test]
fn deserialize_invalid_struct_base64() {
    #[derive(Serialize, Deserialize, Debug)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    let json = br#"{"bytes":"12345"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new();
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let demo = Demo::deserialize(bytefmt_json_de);

    let msg = format!("{}", demo.unwrap_err());
    assert_eq!(
        "invalid length 5, expected valid base64 length at line 1 column 16",
        msg
    );

    let json = br#"{"bytes":"12345%"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new();
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let demo = Demo::deserialize(bytefmt_json_de);

    let msg = format!("{}", demo.unwrap_err());
    assert_eq!("invalid value: character `%`, expected valid base64 character at index 5 at line 1 column 17", msg);

    let json = br#"{"bytes":"123456"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let base64_config = base64::engine::GeneralPurposeConfig::new()
        .with_decode_padding_mode(base64::engine::DecodePaddingMode::Indifferent);
    let bytefmt_json_de =
        ByteFmtDeserializer::new_base64(&mut json_de, base64::alphabet::URL_SAFE, base64_config);
    let demo = Demo::deserialize(bytefmt_json_de);

    let msg = format!("{}", demo.unwrap_err());
    assert_eq!("invalid value: character `6`, expected valid character ending base64 string at line 1 column 17", msg);
}

#[test]
fn deserialize_invalid_struct_hex() {
    #[derive(Serialize, Deserialize, Debug)]
    struct Demo {
        #[serde(with = "serde_bytes")]
        bytes: Vec<u8>,
    }

    let json = br#"{"bytes":"74657374696e6"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let bytefmt_json_de = ByteFmtDeserializer::new_hex(&mut json_de);
    let demo = Demo::deserialize(bytefmt_json_de);

    let msg = format!("{}", demo.unwrap_err());
    assert_eq!(
        "invalid length 13, expected even length at line 1 column 24",
        msg
    );

    let json = br#"{"bytes":"746g7374696e67"}"#;
    let mut json_de = serde_json::Deserializer::from_slice(json);
    let bytefmt_json_de = ByteFmtDeserializer::new_hex(&mut json_de);
    let demo = Demo::deserialize(bytefmt_json_de);

    let msg = format!("{}", demo.unwrap_err());
    assert_eq!(
        "invalid value: character `g`, expected valid hex character at index 3 at line 1 column 25",
        msg
    );
}