From b5c1c1ea79575b5ace252066eef57b52f6ede455 Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Tue, 3 Jun 2025 18:04:27 +0200 Subject: [PATCH] Pcd is BTreeMap> --- src/pcd.rs | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/pcd.rs b/src/pcd.rs index bc49db6..0923389 100644 --- a/src/pcd.rs +++ b/src/pcd.rs @@ -1,8 +1,6 @@ use anyhow::{Error, Result}; use rs_merkle::{algorithms::Sha256, MerkleTree}; -use serde::de::{DeserializeOwned, Error as DeError}; use serde::ser::SerializeStruct; -use wasm_bindgen::JsValue; use std::collections::btree_map::Keys; use std::collections::{BTreeMap, HashSet}; use std::hash::{Hash as StdHash, Hasher}; @@ -132,24 +130,37 @@ impl AnkPcdHash { #[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Tsify)] #[tsify(into_wasm_abi, from_wasm_abi)] -pub struct Pcd(BTreeMap); +pub struct Pcd(BTreeMap>); impl IntoIterator for Pcd { - type Item = (String, Value); - type IntoIter = std::collections::btree_map::IntoIter; + type Item = (String, Vec); + type IntoIter = std::collections::btree_map::IntoIter>; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } } +impl TryFrom for Pcd { + type Error = Error; + + fn try_from(value: Value) -> Result { + let as_object = value.as_object().ok_or_else(|| Error::msg("Pcd must be an object"))?; + let map: Result>> = as_object.iter().map(|(key, value)| { + let serialized = crate::serialization::ciborium_serialize(value)?; + Ok((key.clone(), serialized)) + }).collect(); + + Ok(Pcd(map?)) + } +} impl Pcd { - pub fn new(map: BTreeMap) -> Self { + pub fn new(map: BTreeMap>) -> Self { Self(map) } - pub fn get(&self, key: &str) -> Option<&Value> { + pub fn get(&self, key: &str) -> Option<&Vec> { self.0.get(key) } @@ -157,15 +168,15 @@ impl Pcd { self.0.len() } - pub fn iter(&self) -> std::collections::btree_map::Iter<'_, String, Value> { + pub fn iter(&self) -> std::collections::btree_map::Iter<'_, String, Vec> { self.0.iter() } - pub fn iter_mut(&mut self) -> std::collections::btree_map::IterMut<'_, String, Value> { + pub fn iter_mut(&mut self) -> std::collections::btree_map::IterMut<'_, String, Vec> { self.0.iter_mut() } - pub fn insert(&mut self, key: String, value: Value) -> Option { + pub fn insert(&mut self, key: String, value: Vec) -> Option> { self.0.insert(key, value) } } @@ -206,16 +217,18 @@ impl PcdCommitments { self.0.is_empty() } - pub fn update_with_value(&mut self, outpoint: &OutPoint, field: &str, new_value: &Value) -> Result<()> { + pub fn update_with_value(&mut self, outpoint: &OutPoint, field: &str, new_value: &[u8]) -> Result<()> { let serialized_outpoint = serialize(outpoint); if let Some(old_hash) = self.get_mut(field) { // We hash the new_value - let mut value_bin = serde_json::to_string(new_value)?.into_bytes(); + let mut value_bin = new_value.to_vec(); value_bin.extend_from_slice(field.as_bytes()); let tagged_hash = AnkPcdHash::from_value_with_outpoint(&value_bin, &serialized_outpoint); *old_hash = tagged_hash.to_byte_array(); + Ok(()) + } else { + Err(Error::msg("Field not found")) } - Ok(()) } pub fn contains_key(&self, key: &str) -> bool {