git.delta.rocks / unique-network / refs/commits / a64769ff6bff

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;20use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet};21use sp_std::vec::Vec;2223use frame_support::{24	BoundedVec,25	storage::{bounded_btree_map::BoundedBTreeMap, bounded_btree_set::BoundedBTreeSet},26};2728/// [`serde`] implementations for [`BoundedVec`].29pub mod vec_serde {30	use core::convert::TryFrom;3132	use frame_support::{traits::Get, BoundedVec};33	use serde::{34		de::{self, Deserialize, Error},35		ser::{self, Serialize},36	};37	use sp_std::vec::Vec;3839	pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>40	where41		D: ser::Serializer,42		V: Serialize,43	{44		(value as &Vec<_>).serialize(serializer)45	}4647	pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>48	where49		D: de::Deserializer<'de>,50		V: de::Deserialize<'de>,51		S: Get<u32>,52	{53		// TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?54		let vec = <Vec<V>>::deserialize(deserializer)?;55		let len = vec.len();56		TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))57	}58}5960/// Format [`BoundedVec`] for debug output.61pub fn vec_debug<V, S>(v: &BoundedVec<V, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>62where63	V: fmt::Debug,64{65	use core::fmt::Debug;66	(v as &Vec<V>).fmt(f)67}6869#[allow(dead_code)]70/// [`serde`] implementations for [`BoundedBTreeMap`].71pub mod map_serde {72	use core::convert::TryFrom;7374	use frame_support::{storage::bounded_btree_map::BoundedBTreeMap, traits::Get};75	use serde::{76		de::{self, Deserialize, Error},77		ser::{self, Serialize},78	};79	use sp_std::collections::btree_map::BTreeMap;80	pub fn serialize<D, K, V, S>(81		value: &BoundedBTreeMap<K, V, S>,82		serializer: D,83	) -> Result<D::Ok, D::Error>84	where85		D: ser::Serializer,86		K: Serialize + Ord,87		V: Serialize,88	{89		(value as &BTreeMap<_, _>).serialize(serializer)90	}9192	pub fn deserialize<'de, D, K, V, S>(93		deserializer: D,94	) -> Result<BoundedBTreeMap<K, V, S>, D::Error>95	where96		D: de::Deserializer<'de>,97		K: de::Deserialize<'de> + Ord,98		V: de::Deserialize<'de>,99		S: Get<u32>,100	{101		let map = <BTreeMap<K, V>>::deserialize(deserializer)?;102		let len = map.len();103		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))104	}105}106107/// Format [`BoundedBTreeMap`] for debug output.108pub fn map_debug<K, V, S>(109	v: &BoundedBTreeMap<K, V, S>,110	f: &mut fmt::Formatter,111) -> Result<(), fmt::Error>112where113	K: fmt::Debug + Ord,114	V: fmt::Debug,115{116	use core::fmt::Debug;117	(v as &BTreeMap<K, V>).fmt(f)118}119120#[allow(dead_code)]121/// [`serde`] implementations for [`BoundedBTreeSet`].122pub mod set_serde {123	use core::convert::TryFrom;124125	use frame_support::{storage::bounded_btree_set::BoundedBTreeSet, traits::Get};126	use serde::{127		de::{self, Deserialize, Error},128		ser::{self, Serialize},129	};130	use sp_std::collections::btree_set::BTreeSet;131	pub fn serialize<D, K, S>(132		value: &BoundedBTreeSet<K, S>,133		serializer: D,134	) -> Result<D::Ok, D::Error>135	where136		D: ser::Serializer,137		K: Serialize + Ord,138	{139		(value as &BTreeSet<_>).serialize(serializer)140	}141142	pub fn deserialize<'de, D, K, S>(deserializer: D) -> Result<BoundedBTreeSet<K, S>, D::Error>143	where144		D: de::Deserializer<'de>,145		K: de::Deserialize<'de> + Ord,146		S: Get<u32>,147	{148		let map = <BTreeSet<K>>::deserialize(deserializer)?;149		let len = map.len();150		TryFrom::try_from(map).map_err(|_| D::Error::invalid_length(len, &"lesser size"))151	}152}153154/// Format [`BoundedBTreeSet`] for debug output.155pub fn set_debug<K, S>(v: &BoundedBTreeSet<K, S>, f: &mut fmt::Formatter) -> Result<(), fmt::Error>156where157	K: fmt::Debug + Ord,158{159	use core::fmt::Debug;160	(v as &BTreeSet<K>).fmt(f)161}