rain_metadata/meta/
normalize.rs1use super::{
2 KnownMeta,
3 super::error::Error,
4 types::{
5 op::v1::OpMeta, authoring::v1::AuthoringMeta, solidity_abi::v2::SolidityAbiMeta,
6 interpreter_caller::v1::InterpreterCallerMeta,
7 },
8};
9
10fn normalize_json<'de, T>(data: &'de [u8]) -> Result<Vec<u8>, Error>
11where
12 T: serde::Deserialize<'de> + serde::Serialize + validator::Validate,
13{
14 let parsed = serde_json::from_str::<T>(std::str::from_utf8(data)?)?;
15 parsed.validate()?;
16 Ok(serde_json::to_string(&parsed)?.as_bytes().to_vec())
17}
18
19impl KnownMeta {
20 pub fn normalize(&self, data: &[u8]) -> Result<Vec<u8>, Error> {
22 Ok(match self {
23 KnownMeta::OpV1 => normalize_json::<OpMeta>(data)?,
24 KnownMeta::SolidityAbiV2 => normalize_json::<SolidityAbiMeta>(data)?,
25 KnownMeta::InterpreterCallerMetaV1 => normalize_json::<InterpreterCallerMeta>(data)?,
26 KnownMeta::AuthoringMetaV1 => {
27 match AuthoringMeta::abi_decode(data) {
31 Ok(am) => am.abi_encode_validate()?,
32 _ => AuthoringMeta::abi_encode_validate(
33 &serde_json::from_str::<AuthoringMeta>(std::str::from_utf8(data)?)?,
34 )?,
35 }
36 }
37 _ => data.to_vec(),
40 })
41 }
42}