// Copyright 2018-2020 Parity Technologies (UK) Ltd.
// This file is part of cargo-contract.
//
// cargo-contract 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.
//
// cargo-contract 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 cargo-contract. If not, see .
use super::scon::Value;
use crate::cmd::extrinsics::transcode::scon::Hex;
use anyhow::{
Context,
Result,
};
use scale::{
Decode,
Encode,
Output,
};
use scale_info::{
form::PortableForm,
IntoPortable,
Path,
TypeInfo,
};
use sp_core::crypto::{
AccountId32,
Ss58Codec,
};
use std::{
boxed::Box,
collections::HashMap,
convert::TryFrom,
str::FromStr,
};
/// Provides custom encoding and decoding for predefined environment types.
#[derive(Default)]
pub struct EnvTypesTranscoder {
encoders: HashMap>,
decoders: HashMap>,
}
impl EnvTypesTranscoder {
/// Construct an `EnvTypesTranscoder` from the given type registry.
pub fn new(
encoders: HashMap>,
decoders: HashMap>,
) -> Self {
Self { encoders, decoders }
}
/// If the given type id is for a type with custom encoding, encodes the given value with the
/// custom encoder and returns `true`. Otherwise returns `false`.
///
/// # Errors
///
/// - If the custom encoding fails.
pub fn try_encode(
&self,
type_id: u32,
value: &Value,
output: &mut O,
) -> Result
where
O: Output,
{
match self.encoders.get(&type_id) {
Some(encoder) => {
log::debug!("Encoding type {:?} with custom encoder", type_id);
let encoded_env_type = encoder
.encode_value(value)
.context("Error encoding custom type")?;
output.write(&encoded_env_type);
Ok(true)
}
None => Ok(false),
}
}
/// If the given type lookup id is for an environment type with custom
/// decoding, decodes the given input with the custom decoder and returns
/// `Some(value)`. Otherwise returns `None`.
///
/// # Errors
///
/// - If the custom decoding fails.
pub fn try_decode(&self, type_id: u32, input: &mut &[u8]) -> Result