git.delta.rocks / unique-network / refs/commits / 011ebf22fd46

difftreelog

source

primitives/data-structs/src/bounded.rs3.4 KiBsourcehistory
1use core::fmt;2use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet};3use sp_std::vec::Vec;45use frame_support::{6	BoundedVec,7	storage::{bounded_btree_map::BoundedBTreeMap, bounded_btree_set::BoundedBTreeSet},8};910/// BoundedVec doesn't supports serde11#[cfg(feature = "serde1")]12pub mod vec_serde {13	use core::convert::TryFrom;14	use frame_support::{BoundedVec, traits::Get};15	use serde::{16		ser::{self, Serialize},17		de::{self, Deserialize, Error},18	};19	use sp_std::vec::Vec;2021	pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>22	where23		D: ser::Serializer,24		V: Serialize,25	{26		(value as &Vec<_>).serialize(serializer)27	}2829	pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>30	where31		D: de::Deserializer<'de>,32		V: de::Deserialize<'de>,33		S: Get<u32>,34	{35		// TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?36		let vec = <Vec<V>>::deserialize(deserializer)?;37		let len = vec.len();38		TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))39	}40}4142pub fn vec_debug<V, S>(v: &BoundedVec<V, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>43where44	V: fmt::Debug,45{46	use core::fmt::Debug;47	(&v as &Vec<V>).fmt(f)48}4950#[cfg(feature = "serde1")]51#[allow(dead_code)]52pub mod map_serde {53	use core::convert::TryFrom;54	use sp_std::collections::btree_map::BTreeMap;55	use frame_support::{traits::Get, storage::bounded_btree_map::BoundedBTreeMap};56	use serde::{57		ser::{self, Serialize},58		de::{self, Deserialize, Error},59	};60	pub fn serialize<D, K, V, S>(61		value: &BoundedBTreeMap<K, V, S>,62		serializer: D,63	) -> Result<D::Ok, D::Error>64	where65		D: ser::Serializer,66		K: Serialize + Ord,67		V: Serialize,68	{69		(value as &BTreeMap<_, _>).serialize(serializer)70	}7172	pub fn deserialize<'de, D, K, V, S>(73		deserializer: D,74	) -> Result<BoundedBTreeMap<K, V, S>, D::Error>75	where76		D: de::Deserializer<'de>,77		K: de::Deserialize<'de> + Ord,78		V: de::Deserialize<'de>,79		S: Get<u32>,80	{81		let map = <BTreeMap<K, V>>::deserialize(deserializer)?;82		let len = map.len();83		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))84	}85}8687pub fn map_debug<K, V, S>(88	v: &BoundedBTreeMap<K, V, S>,89	f: &mut fmt::Formatter,90) -> Result<(), fmt::Error>91where92	K: fmt::Debug + Ord,93	V: fmt::Debug,94{95	use core::fmt::Debug;96	(&v as &BTreeMap<K, V>).fmt(f)97}9899#[cfg(feature = "serde1")]100#[allow(dead_code)]101pub mod set_serde {102	use core::convert::TryFrom;103	use sp_std::collections::btree_set::BTreeSet;104	use frame_support::{traits::Get, storage::bounded_btree_set::BoundedBTreeSet};105	use serde::{106		ser::{self, Serialize},107		de::{self, Deserialize, Error},108	};109	pub fn serialize<D, K, S>(110		value: &BoundedBTreeSet<K, S>,111		serializer: D,112	) -> Result<D::Ok, D::Error>113	where114		D: ser::Serializer,115		K: Serialize + Ord,116	{117		(value as &BTreeSet<_>).serialize(serializer)118	}119120	pub fn deserialize<'de, D, K, S>(deserializer: D) -> Result<BoundedBTreeSet<K, S>, D::Error>121	where122		D: de::Deserializer<'de>,123		K: de::Deserialize<'de> + Ord,124		S: Get<u32>,125	{126		let map = <BTreeSet<K>>::deserialize(deserializer)?;127		let len = map.len();128		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))129	}130}131132pub fn set_debug<K, S>(v: &BoundedBTreeSet<K, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>133where134	K: fmt::Debug + Ord,135{136	use core::fmt::Debug;137	(&v as &BTreeSet<K>).fmt(f)138}