Skip to content

Commit

Permalink
TypeIds, more info for compact encoded values and tidy up (#1)
Browse files Browse the repository at this point in the history
* Make lifetimes more precise, and depth for compact values

* provide more details back for compact values

* clippy and check fix

* Provide field names too when decoding compact values

* Add a helper method on CompactLocation
  • Loading branch information
jsdw committed Jul 28, 2022
1 parent 22b4651 commit 796d6e0
Show file tree
Hide file tree
Showing 14 changed files with 680 additions and 311 deletions.
109 changes: 68 additions & 41 deletions examples/value_type.rs
Expand Up @@ -14,7 +14,7 @@
// limitations under the License.

use codec::Encode;
use scale_decode::visitor;
use scale_decode::visitor::{self, TypeId};

// A custom type we'd like to decode into:
#[derive(Debug, PartialEq)]
Expand All @@ -39,12 +39,12 @@ enum Value {
CompactU64(u64),
CompactU128(u128),
Sequence(Vec<Value>),
Composite(Vec<(Option<String>, Value)>),
Composite(Vec<(String, Value)>),
Tuple(Vec<Value>),
Str(String),
Array(Vec<Value>),
Variant(String, Vec<(Option<String>, Value)>),
BitSequence(visitor::types::BitSequenceValue),
Variant(String, Vec<(String, Value)>),
BitSequence(visitor::BitSequenceValue),
}

// Implement the `Visitor` trait to define how to go from SCALE
Expand All @@ -54,66 +54,87 @@ impl visitor::Visitor for ValueVisitor {
type Value = Value;
type Error = visitor::DecodeError;

fn visit_bool(self, value: bool) -> Result<Self::Value, Self::Error> {
fn visit_bool(self, value: bool, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::Bool(value))
}
fn visit_char(self, value: char) -> Result<Self::Value, Self::Error> {
fn visit_char(self, value: char, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::Char(value))
}
fn visit_u8(self, value: u8) -> Result<Self::Value, Self::Error> {
fn visit_u8(self, value: u8, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U8(value))
}
fn visit_u16(self, value: u16) -> Result<Self::Value, Self::Error> {
fn visit_u16(self, value: u16, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U16(value))
}
fn visit_u32(self, value: u32) -> Result<Self::Value, Self::Error> {
fn visit_u32(self, value: u32, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U32(value))
}
fn visit_u64(self, value: u64) -> Result<Self::Value, Self::Error> {
fn visit_u64(self, value: u64, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U64(value))
}
fn visit_u128(self, value: u128) -> Result<Self::Value, Self::Error> {
fn visit_u128(self, value: u128, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U128(value))
}
fn visit_u256(self, value: &[u8; 32]) -> Result<Self::Value, Self::Error> {
fn visit_u256(self, value: &[u8; 32], _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::U256(*value))
}
fn visit_i8(self, value: i8) -> Result<Self::Value, Self::Error> {
fn visit_i8(self, value: i8, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I8(value))
}
fn visit_i16(self, value: i16) -> Result<Self::Value, Self::Error> {
fn visit_i16(self, value: i16, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I16(value))
}
fn visit_i32(self, value: i32) -> Result<Self::Value, Self::Error> {
fn visit_i32(self, value: i32, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I32(value))
}
fn visit_i64(self, value: i64) -> Result<Self::Value, Self::Error> {
fn visit_i64(self, value: i64, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I64(value))
}
fn visit_i128(self, value: i128) -> Result<Self::Value, Self::Error> {
fn visit_i128(self, value: i128, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I128(value))
}
fn visit_i256(self, value: &[u8; 32]) -> Result<Self::Value, Self::Error> {
fn visit_i256(self, value: &[u8; 32], _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::I256(*value))
}
fn visit_compact_u8(self, value: u8) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU8(value))
fn visit_compact_u8(
self,
value: visitor::Compact<u8>,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU8(value.value()))
}
fn visit_compact_u16(self, value: u16) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU16(value))
fn visit_compact_u16(
self,
value: visitor::Compact<u16>,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU16(value.value()))
}
fn visit_compact_u32(self, value: u32) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU32(value))
fn visit_compact_u32(
self,
value: visitor::Compact<u32>,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU32(value.value()))
}
fn visit_compact_u64(self, value: u64) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU64(value))
fn visit_compact_u64(
self,
value: visitor::Compact<u64>,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU64(value.value()))
}
fn visit_compact_u128(self, value: u128) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU128(value))
fn visit_compact_u128(
self,
value: visitor::Compact<u128>,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::CompactU128(value.value()))
}
fn visit_sequence(
self,
value: &mut visitor::types::Sequence<'_>,
value: &mut visitor::Sequence,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
let mut vals = vec![];
while let Some(val) = value.decode_item(ValueVisitor)? {
Expand All @@ -123,40 +144,45 @@ impl visitor::Visitor for ValueVisitor {
}
fn visit_composite(
self,
value: &mut visitor::types::Composite<'_>,
value: &mut visitor::Composite,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
let mut vals = vec![];
while let Some((name, val)) = value.decode_item(ValueVisitor)? {
vals.push((name.map(|s| s.to_owned()), val));
while let Some((name, val)) = value.decode_item_with_name(ValueVisitor)? {
vals.push((name.to_owned(), val));
}
Ok(Value::Composite(vals))
}
fn visit_tuple(
self,
value: &mut visitor::types::Tuple<'_>,
value: &mut visitor::Tuple,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
let mut vals = vec![];
while let Some(val) = value.decode_item(ValueVisitor)? {
vals.push(val);
}
Ok(Value::Tuple(vals))
}
fn visit_str(self, value: &visitor::types::Str<'_>) -> Result<Self::Value, Self::Error> {
fn visit_str(self, value: visitor::Str, _type_id: TypeId) -> Result<Self::Value, Self::Error> {
Ok(Value::Str(value.as_str()?.to_owned()))
}
fn visit_variant(
self,
value: &mut visitor::types::Variant<'_>,
value: &mut visitor::Variant,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
let mut vals = vec![];
while let Some((name, val)) = value.decode_item(ValueVisitor)? {
vals.push((name.map(|s| s.to_owned()), val));
let fields = value.fields();
while let Some((name, val)) = fields.decode_item_with_name(ValueVisitor)? {
vals.push((name.to_owned(), val));
}
Ok(Value::Variant(value.name().to_owned(), vals))
}
fn visit_array(
self,
value: &mut visitor::types::Array<'_>,
value: &mut visitor::Array,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
let mut vals = vec![];
while let Some(val) = value.decode_item(ValueVisitor)? {
Expand All @@ -166,7 +192,8 @@ impl visitor::Visitor for ValueVisitor {
}
fn visit_bitsequence(
self,
value: &mut visitor::types::BitSequence<'_>,
value: &mut visitor::BitSequence,
_type_id: TypeId,
) -> Result<Self::Value, Self::Error> {
Ok(Value::BitSequence(value.decode_bitsequence()?))
}
Expand Down Expand Up @@ -195,8 +222,8 @@ fn main() {
Value::Variant(
"Bar".to_owned(),
vec![
(Some("hi".to_string()), Value::Str("hello".to_string())),
(Some("other".to_string()), Value::U128(123)),
("hi".to_string(), Value::Str("hello".to_string())),
("other".to_string(), Value::U128(123)),
],
)
)
Expand Down

0 comments on commit 796d6e0

Please sign in to comment.