git.delta.rocks / unique-network / refs/commits / 5543fa933a08

difftreelog

source

primitives/data-structs/src/bounded.rs4.5 KiBsourcehistory
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617//! This module contins implementations for support bounded structures ([`BoundedVec`], [`BoundedBTreeMap`], [`BoundedBTreeSet`]) in [`serde`].1819use core::fmt;2021use frame_support::{22	storage::{bounded_btree_map::BoundedBTreeMap, bounded_btree_set::BoundedBTreeSet},23	BoundedVec,24};25use sp_std::{26	collections::{btree_map::BTreeMap, btree_set::BTreeSet},27	vec::Vec,28};2930/// [`serde`] implementations for [`BoundedVec`].31pub mod vec_serde {32	use core::convert::TryFrom;3334	use frame_support::{traits::Get, BoundedVec};35	use serde::{36		de::{self, Deserialize, Error},37		ser::{self, Serialize},38	};39	use sp_std::vec::Vec;4041	pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>42	where43		D: ser::Serializer,44		V: Serialize,45	{46		(value as &Vec<_>).serialize(serializer)47	}4849	pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>50	where51		D: de::Deserializer<'de>,52		V: de::Deserialize<'de>,53		S: Get<u32>,54	{55		// TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?56		let vec = <Vec<V>>::deserialize(deserializer)?;57		let len = vec.len();58		TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))59	}60}6162/// Format [`BoundedVec`] for debug output.63pub fn vec_debug<V, S>(v: &BoundedVec<V, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>64where65	V: fmt::Debug,66{67	use core::fmt::Debug;68	(v as &Vec<V>).fmt(f)69}7071#[allow(dead_code)]72/// [`serde`] implementations for [`BoundedBTreeMap`].73pub mod map_serde {74	use core::convert::TryFrom;7576	use frame_support::{storage::bounded_btree_map::BoundedBTreeMap, traits::Get};77	use serde::{78		de::{self, Deserialize, Error},79		ser::{self, Serialize},80	};81	use sp_std::collections::btree_map::BTreeMap;82	pub fn serialize<D, K, V, S>(83		value: &BoundedBTreeMap<K, V, S>,84		serializer: D,85	) -> Result<D::Ok, D::Error>86	where87		D: ser::Serializer,88		K: Serialize + Ord,89		V: Serialize,90	{91		(value as &BTreeMap<_, _>).serialize(serializer)92	}9394	pub fn deserialize<'de, D, K, V, S>(95		deserializer: D,96	) -> Result<BoundedBTreeMap<K, V, S>, D::Error>97	where98		D: de::Deserializer<'de>,99		K: de::Deserialize<'de> + Ord,100		V: de::Deserialize<'de>,101		S: Get<u32>,102	{103		let map = <BTreeMap<K, V>>::deserialize(deserializer)?;104		let len = map.len();105		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))106	}107}108109/// Format [`BoundedBTreeMap`] for debug output.110pub fn map_debug<K, V, S>(111	v: &BoundedBTreeMap<K, V, S>,112	f: &mut fmt::Formatter,113) -> Result<(), fmt::Error>114where115	K: fmt::Debug + Ord,116	V: fmt::Debug,117{118	use core::fmt::Debug;119	(v as &BTreeMap<K, V>).fmt(f)120}121122#[allow(dead_code)]123/// [`serde`] implementations for [`BoundedBTreeSet`].124pub mod set_serde {125	use core::convert::TryFrom;126127	use frame_support::{storage::bounded_btree_set::BoundedBTreeSet, traits::Get};128	use serde::{129		de::{self, Deserialize, Error},130		ser::{self, Serialize},131	};132	use sp_std::collections::btree_set::BTreeSet;133	pub fn serialize<D, K, S>(134		value: &BoundedBTreeSet<K, S>,135		serializer: D,136	) -> Result<D::Ok, D::Error>137	where138		D: ser::Serializer,139		K: Serialize + Ord,140	{141		(value as &BTreeSet<_>).serialize(serializer)142	}143144	pub fn deserialize<'de, D, K, S>(deserializer: D) -> Result<BoundedBTreeSet<K, S>, D::Error>145	where146		D: de::Deserializer<'de>,147		K: de::Deserialize<'de> + Ord,148		S: Get<u32>,149	{150		let map = <BTreeSet<K>>::deserialize(deserializer)?;151		let len = map.len();152		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))153	}154}155156/// Format [`BoundedBTreeSet`] for debug output.157pub fn set_debug<K, S>(v: &BoundedBTreeSet<K, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>158where159	K: fmt::Debug + Ord,160{161	use core::fmt::Debug;162	(v as &BTreeSet<K>).fmt(f)163}