mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-04 12:47:22 +00:00
4c7539cab5
* Use beefy branch with scale-info * Add patches * Sprinkle some TypeInfo derives * Add some TypeInfo deriv * Cargo.lock * Derive TypeInfo and skip type params for Xcm types * Cargo.lock * Fix up scale_info bounds attributes * Fix up dependencies * Use my own beefy-primitives branch * Bump BEEFY * Update patches * Add some scale-info dependencies and TypeInfo derives * More TypeInfo decoration * Update scale-info * Some TypeInfos and remove more Event pallet::metadata * Moar TypeInfos * TypeInfos galore, fix up metadata runtime API * TypeInfo * TypeInfos, update other runtime metadata APIs * Fix up Kusama, comment out some `usize` QueueSize parameter types * Remove local diener patches * Cargo.lock * Cargo.lock * Update to scale-info crates.io release * Update primitive-types branch * Update pallet-beefy to use custom branch * Update other parity-common deps * Update parity-common patches * bump a bunch of deps in parity-common * Remove parity-common patches * Bump finality-grandpa version * Cargo.lock * Update scale-info to 0.9.1 * Add recursion_limit for runtime-parachains * Add some scale_info attributes * Cargo.lock * Revert finality-grandpa bump * Cargo.lock, scale-info update * cargo update * Make sure using patched version of finality-grandpa * Use patched scale-info * Update to scale-info 0.10.0 * Update finality-grandpa * Cargo.lock * Update beefy deps * Update beefy deps again * Add scale-info dependency * Remove deprecated pallet::metadata attributes. * Add some missing scale-info deps and derives * Use some variant struct call syntax * Add missing TypeInfo impl * Add some more TypeInfo impls * Convert some call enum struct variant constructors * More scale-info deps and derives * Call enum struct variants * TypeInfo derives * Call enum variant structs * scale-info deps and derives * Call enum variant struct constructors * Use beefy-primitives scale-info feature * Use grandpa-bridge-gadget master branch * Remove finality-grandpa patch * Add missing scale_info dependency and derive * Fix up some call variant constructors * Add missing scale_info dependency * Fix some test errors * More TypeInfo derives * More call variant structs * Call variant structs in tests * Cargo.lock * Fmt * Fix more call struct variants * Another call struct variant * add scale-info/std features explicitly * More call struct variants * Add missing scale-info dependency * Fmt * review: activate scale-info/std where missing * Remove some duplicate std feature activation * review: add scale_info bounds() attr * More call variant structs * Remove recursion limit * Update beefy-primitives * Update beefy-primitives * Fix simnet call variant struct errors * Fmt * cargo update -p beefy-primitives * Add some missing TypeInfo derives * Fix some call variants * Fix some call variant underscores * Cargo.lock * Cargo.lock * Add missing TypeInfo derive * Add some more missing TypeInfo derives * Even more missing TypeInfo derives * Add TypeInfo derives to new xcm types * Fmt * Cargo.lock * Add missing TypeInfo impls * Cargo.lock * More missing TypeInfos * Fixes * Cargo.lock * Cargo.lock * Add TypeInfo impls to xcm v2 * Update to scale-info 1.0 * Update finality-grandpa 0.14.4, patch for now * Update beefy * Remove patched finality-grandpa * Add TypeInfo impl to Outcome * Fixes * Call variant struct * Call variant struct * Fix test * Add TypeInfo impl * Cargo.lock * Cargo.lock * Cargo.lock * git checkout master Cargo.lock * update Substrate * Add missing scale-info features for beefy-primitives * Fmt * Remove check for now * Update beefy-primitives, removes scale-info feature * Update beefy-primitives again Co-authored-by: adoerr <0xad@gmx.net> Co-authored-by: Andronik Ordian <write@reusable.software> Co-authored-by: thiolliere <gui.thiolliere@gmail.com> Co-authored-by: parity-processbot <> Co-authored-by: Bastian Köcher <info@kchr.de>
128 lines
3.6 KiB
Rust
128 lines
3.6 KiB
Rust
// Copyright 2020 Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Polkadot is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use crate::MAX_XCM_DECODE_DEPTH;
|
|
use alloc::vec::Vec;
|
|
use parity_scale_codec::{Decode, DecodeLimit, Encode};
|
|
|
|
/// Wrapper around the encoded and decoded versions of a value.
|
|
/// Caches the decoded value once computed.
|
|
#[derive(Encode, Decode, scale_info::TypeInfo)]
|
|
#[codec(encode_bound())]
|
|
#[codec(decode_bound())]
|
|
#[scale_info(bounds(), skip_type_params(T))]
|
|
pub struct DoubleEncoded<T> {
|
|
encoded: Vec<u8>,
|
|
#[codec(skip)]
|
|
decoded: Option<T>,
|
|
}
|
|
|
|
impl<T> Clone for DoubleEncoded<T> {
|
|
fn clone(&self) -> Self {
|
|
Self { encoded: self.encoded.clone(), decoded: None }
|
|
}
|
|
}
|
|
|
|
impl<T> PartialEq for DoubleEncoded<T> {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
self.encoded.eq(&other.encoded)
|
|
}
|
|
}
|
|
impl<T> Eq for DoubleEncoded<T> {}
|
|
|
|
impl<T> core::fmt::Debug for DoubleEncoded<T> {
|
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
self.encoded.fmt(f)
|
|
}
|
|
}
|
|
|
|
impl<T> From<Vec<u8>> for DoubleEncoded<T> {
|
|
fn from(encoded: Vec<u8>) -> Self {
|
|
Self { encoded, decoded: None }
|
|
}
|
|
}
|
|
|
|
impl<T> DoubleEncoded<T> {
|
|
pub fn into<S>(self) -> DoubleEncoded<S> {
|
|
DoubleEncoded::from(self)
|
|
}
|
|
|
|
pub fn from<S>(e: DoubleEncoded<S>) -> Self {
|
|
Self { encoded: e.encoded, decoded: None }
|
|
}
|
|
|
|
/// Provides an API similar to `AsRef` that provides access to the inner value.
|
|
/// `AsRef` implementation would expect an `&Option<T>` return type.
|
|
pub fn as_ref(&self) -> Option<&T> {
|
|
self.decoded.as_ref()
|
|
}
|
|
}
|
|
|
|
impl<T: Decode> DoubleEncoded<T> {
|
|
/// Decode the inner encoded value and store it.
|
|
/// Returns a reference to the value in case of success and `Err(())` in case the decoding fails.
|
|
pub fn ensure_decoded(&mut self) -> Result<&T, ()> {
|
|
if self.decoded.is_none() {
|
|
self.decoded =
|
|
T::decode_all_with_depth_limit(MAX_XCM_DECODE_DEPTH, &mut &self.encoded[..]).ok();
|
|
}
|
|
self.decoded.as_ref().ok_or(())
|
|
}
|
|
|
|
/// Move the decoded value out or (if not present) decode `encoded`.
|
|
pub fn take_decoded(&mut self) -> Result<T, ()> {
|
|
self.decoded
|
|
.take()
|
|
.or_else(|| {
|
|
T::decode_all_with_depth_limit(MAX_XCM_DECODE_DEPTH, &mut &self.encoded[..]).ok()
|
|
})
|
|
.ok_or(())
|
|
}
|
|
|
|
/// Provides an API similar to `TryInto` that allows fallible conversion to the inner value type.
|
|
/// `TryInto` implementation would collide with std blanket implementation based on `TryFrom`.
|
|
pub fn try_into(mut self) -> Result<T, ()> {
|
|
self.ensure_decoded()?;
|
|
self.decoded.ok_or(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn ensure_decoded_works() {
|
|
let val: u64 = 42;
|
|
let mut encoded: DoubleEncoded<_> = Encode::encode(&val).into();
|
|
assert_eq!(encoded.ensure_decoded(), Ok(&val));
|
|
}
|
|
|
|
#[test]
|
|
fn take_decoded_works() {
|
|
let val: u64 = 42;
|
|
let mut encoded: DoubleEncoded<_> = Encode::encode(&val).into();
|
|
assert_eq!(encoded.take_decoded(), Ok(val));
|
|
}
|
|
|
|
#[test]
|
|
fn try_into_works() {
|
|
let val: u64 = 42;
|
|
let encoded: DoubleEncoded<_> = Encode::encode(&val).into();
|
|
assert_eq!(encoded.try_into(), Ok(val));
|
|
}
|
|
}
|