whisky_csl/tx_parser/
metadata.rs

1use cardano_serialization_lib as csl;
2use whisky_common::{Metadata, WError};
3
4use super::CSLParser;
5
6impl CSLParser {
7    pub fn get_metadata(&self) -> &Vec<Metadata> {
8        &self.tx_body.metadata
9    }
10
11    pub(super) fn extract_metadata(&mut self) -> Result<(), WError> {
12        if let Some(aux_data) = &self.csl_aux_data {
13            self.tx_body.metadata = csl_aux_data_to_metadata(&aux_data)?;
14        }
15        Ok(())
16    }
17}
18
19fn csl_aux_data_to_metadata(aux_data: &csl::AuxiliaryData) -> Result<Vec<Metadata>, WError> {
20    let metadata = aux_data.metadata();
21    let csl_metadata_list = metadata.unwrap_or(csl::GeneralTransactionMetadata::new());
22    let keys = csl_metadata_list.keys();
23    let metadata_list_len = keys.len();
24    let mut metadata_list = Vec::new();
25    for i in 0..metadata_list_len {
26        let key = keys.get(i);
27        let metadata = csl_metadata_list
28            .get(&key)
29            .ok_or_else(|| WError::new("csl_aux_data_to_metadata", "Failed to get metadata"))?;
30        let metadata = Metadata {
31            tag: key.to_string(),
32            metadata: csl::decode_metadatum_to_json_str(
33                &metadata,
34                csl::MetadataJsonSchema::NoConversions,
35            )
36            .map_err(|e| {
37                WError::new(
38                    "csl_aux_data_to_metadata",
39                    &format!("Failed to decode metadata: {:?}", e),
40                )
41            })?,
42        };
43        metadata_list.push(metadata);
44    }
45    Ok(metadata_list)
46}