in src/sign.rs [270:327]
fn deserialize<D>(deserializer: D) -> Result<CoseSign1, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::{Error, SeqAccess, Visitor};
use std::fmt;
struct CoseSign1Visitor;
impl<'de> Visitor<'de> for CoseSign1Visitor {
type Value = CoseSign1;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("a possibly tagged CoseSign1 structure")
}
fn visit_seq<A>(self, mut seq: A) -> Result<CoseSign1, A::Error>
where
A: SeqAccess<'de>,
{
// This is the untagged version
let protected = match seq.next_element()? {
Some(v) => v,
None => return Err(A::Error::missing_field("protected")),
};
let unprotected = match seq.next_element()? {
Some(v) => v,
None => return Err(A::Error::missing_field("unprotected")),
};
let payload = match seq.next_element()? {
Some(v) => v,
None => return Err(A::Error::missing_field("payload")),
};
let signature = match seq.next_element()? {
Some(v) => v,
None => return Err(A::Error::missing_field("signature")),
};
Ok(CoseSign1 {
protected,
unprotected,
payload,
signature,
})
}
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<CoseSign1, D::Error>
where
D: Deserializer<'de>,
{
// This is the tagged version: we ignore the tag part, and just go into it
deserializer.deserialize_seq(CoseSign1Visitor)
}
}
deserializer.deserialize_any(CoseSign1Visitor)
}