#![no_std]
#![deny(missing_docs)]
use core::iter::ExactSizeIterator;
#[cfg(feature = "scale-info")]
pub mod portable_registry;
#[cfg(feature = "visitor")]
pub mod visitor;
pub trait TypeResolver {
type TypeId: TypeId + 'static;
type Error: core::fmt::Debug + core::fmt::Display;
fn resolve_type<'this, V: ResolvedTypeVisitor<'this, TypeId = Self::TypeId>>(
&'this self,
type_id: Self::TypeId,
visitor: V,
) -> Result<V::Value, Self::Error>;
}
pub trait ResolvedTypeVisitor<'resolver>: Sized {
type TypeId: TypeId + 'static;
type Value;
fn visit_unhandled(self, kind: UnhandledKind) -> Self::Value;
fn visit_not_found(self) -> Self::Value {
self.visit_unhandled(UnhandledKind::NotFound)
}
fn visit_composite<Path, Fields>(self, _path: Path, _fields: Fields) -> Self::Value
where
Path: PathIter<'resolver>,
Fields: FieldIter<'resolver, Self::TypeId>,
{
self.visit_unhandled(UnhandledKind::Composite)
}
fn visit_variant<Path, Fields, Var>(self, _path: Path, _variants: Var) -> Self::Value
where
Path: PathIter<'resolver>,
Fields: FieldIter<'resolver, Self::TypeId>,
Var: VariantIter<'resolver, Fields>,
{
self.visit_unhandled(UnhandledKind::Variant)
}
fn visit_sequence<Path>(self, _path: Path, _type_id: Self::TypeId) -> Self::Value
where
Path: PathIter<'resolver>,
{
self.visit_unhandled(UnhandledKind::Sequence)
}
fn visit_array(self, _type_id: Self::TypeId, _len: usize) -> Self::Value {
self.visit_unhandled(UnhandledKind::Array)
}
fn visit_tuple<TypeIds>(self, _type_ids: TypeIds) -> Self::Value
where
TypeIds: ExactSizeIterator<Item = Self::TypeId>,
{
self.visit_unhandled(UnhandledKind::Tuple)
}
fn visit_primitive(self, _primitive: Primitive) -> Self::Value {
self.visit_unhandled(UnhandledKind::Primitive)
}
fn visit_compact(self, _type_id: Self::TypeId) -> Self::Value {
self.visit_unhandled(UnhandledKind::Compact)
}
fn visit_bit_sequence(
self,
_store_format: BitsStoreFormat,
_order_format: BitsOrderFormat,
) -> Self::Value {
self.visit_unhandled(UnhandledKind::BitSequence)
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum UnhandledKind {
NotFound,
Composite,
Variant,
Sequence,
Array,
Tuple,
Primitive,
Compact,
BitSequence,
}
pub trait TypeId: Clone + core::fmt::Debug + core::default::Default {}
impl<T: Clone + core::fmt::Debug + core::default::Default> TypeId for T {}
#[derive(Debug)]
pub struct Field<'resolver, TypeId> {
pub name: Option<&'resolver str>,
pub id: TypeId,
}
impl<'resolver, TypeId: Copy> Copy for Field<'resolver, TypeId> {}
impl<'resolver, TypeId: Clone> Clone for Field<'resolver, TypeId> {
fn clone(&self) -> Self {
Field {
name: self.name,
id: self.id.clone(),
}
}
}
impl<'resolver, TypeId> Field<'resolver, TypeId> {
pub fn new(id: TypeId, name: Option<&'resolver str>) -> Self {
Field { id, name }
}
pub fn unnamed(id: TypeId) -> Self {
Field { name: None, id }
}
pub fn named(id: TypeId, name: &'resolver str) -> Self {
Field {
name: Some(name),
id,
}
}
}
#[derive(Clone, Debug)]
pub struct Variant<'resolver, Fields> {
pub index: u8,
pub name: &'resolver str,
pub fields: Fields,
}
pub trait PathIter<'resolver>: Iterator<Item = &'resolver str> {}
impl<'resolver, T> PathIter<'resolver> for T where T: Iterator<Item = &'resolver str> {}
pub trait FieldIter<'resolver, TypeId>: ExactSizeIterator<Item = Field<'resolver, TypeId>> {}
impl<'resolver, TypeId, T> FieldIter<'resolver, TypeId> for T where
T: ExactSizeIterator<Item = Field<'resolver, TypeId>>
{
}
pub trait VariantIter<'resolver, Fields>:
ExactSizeIterator<Item = Variant<'resolver, Fields>>
{
}
impl<'resolver, Fields, T> VariantIter<'resolver, Fields> for T where
T: ExactSizeIterator<Item = Variant<'resolver, Fields>>
{
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Primitive {
Bool,
Char,
Str,
U8,
U16,
U32,
U64,
U128,
U256,
I8,
I16,
I32,
I64,
I128,
I256,
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum BitsOrderFormat {
Lsb0,
Msb0,
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum BitsStoreFormat {
U8,
U16,
U32,
U64,
}