penumbra_sdk_tct/storage/serialize/
fq.rs1use 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}