penumbra_sdk_tct/storage/serialize/
fq.rs

1use super::*;
2
3pub fn serialize<S>(fq: &Fq, serializer: S) -> Result<S::Ok, S::Error>
4where
5    S: serde::Serializer,
6{
7    serializer.serialize_bytes(&fq.to_bytes())
8}
9
10pub fn deserialize<'de, D>(deserializer: D) -> Result<Fq, D::Error>
11where
12    D: serde::Deserializer<'de>,
13{
14    deserializer.deserialize_bytes(FqVisitor)
15}
16
17struct FqVisitor;
18
19impl<'de> Visitor<'de> for FqVisitor {
20    type Value = Fq;
21
22    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
23        formatter.write_str("a 32-byte array representing a field element")
24    }
25
26    fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>
27    where
28        E: serde::de::Error,
29    {
30        let bytes: [u8; 32] = bytes
31            .try_into()
32            .map_err(|_| serde::de::Error::invalid_length(bytes.len(), &"exactly 32 bytes"))?;
33        let fq = Fq::from_bytes_checked(&bytes).map_err(|e| serde::de::Error::custom(e))?;
34        Ok(fq)
35    }
36}