use crate::sizes::LARGE_BLOB_MAX_FRAGMENT_LENGTH;
use crate::Bytes;
use serde_indexed::{DeserializeIndexed, SerializeIndexed};
#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
#[non_exhaustive]
#[serde_indexed(offset = 1)]
pub struct Request<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub get: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub set: Option<&'a serde_bytes::Bytes>,
pub offset: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub length: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pin_uv_auth_param: Option<&'a serde_bytes::Bytes>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pin_uv_auth_protocol: Option<u32>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
#[non_exhaustive]
#[serde_indexed(offset = 1)]
pub struct Response {
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<Bytes<LARGE_BLOB_MAX_FRAGMENT_LENGTH>>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_test::{assert_de_tokens, assert_ser_tokens, Token};
const FRAGMENT: &[u8] = &[0xaf; 255];
const PIN_AUTH: &[u8] = &[0xad; 32];
#[test]
fn test_de_request_get() {
let request = Request {
get: Some(255),
set: None,
offset: 0,
length: None,
pin_uv_auth_param: None,
pin_uv_auth_protocol: None,
};
assert_de_tokens(
&request,
&[
Token::Map { len: Some(2) },
Token::U64(0x01),
Token::U32(255),
Token::U64(0x03),
Token::U32(0),
Token::MapEnd,
],
);
}
#[test]
fn test_de_request_set() {
let request = Request {
get: None,
set: Some(serde_bytes::Bytes::new(FRAGMENT)),
offset: 0,
length: Some(255),
pin_uv_auth_param: Some(serde_bytes::Bytes::new(PIN_AUTH)),
pin_uv_auth_protocol: Some(1),
};
assert_de_tokens(
&request,
&[
Token::Map { len: Some(5) },
Token::U64(0x02),
Token::BorrowedBytes(FRAGMENT),
Token::U64(0x03),
Token::U32(0),
Token::U64(0x04),
Token::U32(255),
Token::U64(0x05),
Token::BorrowedBytes(PIN_AUTH),
Token::U64(0x06),
Token::U32(1),
Token::MapEnd,
],
);
}
#[test]
fn test_ser_response() {
let response = Response {
config: Some(Bytes::from_slice(&[]).unwrap()),
..Default::default()
};
assert_ser_tokens(
&response,
&[
Token::Map { len: Some(1) },
Token::U64(0x01),
Token::Some,
Token::BorrowedBytes(&[]),
Token::MapEnd,
],
);
}
}