hermes-runtime-components 0.1.0

Implementation of an IBC Relayer in Rust, as a library
Documentation
use core::marker::PhantomData;

use cgp::prelude::*;

#[derive_component(RuntimeTypeComponent, ProvideRuntimeType<Context>)]
pub trait HasRuntimeType: Async {
    type Runtime: HasErrorType;
}

#[derive_component(RuntimeGetterComponent, RuntimeGetter<Context>)]
pub trait HasRuntime: HasRuntimeType {
    fn runtime(&self) -> &Self::Runtime;
}

pub type RuntimeOf<Context> = <Context as HasRuntimeType>::Runtime;

pub struct ProvideRuntimeField<Field>(pub PhantomData<Field>);

impl<Context, Field: Async, Runtime> ProvideRuntimeType<Context> for ProvideRuntimeField<Field>
where
    Context: HasField<Field, Field = Runtime> + Async,
    Runtime: HasErrorType,
{
    type Runtime = Runtime;
}

impl<Context, Field: Async> RuntimeGetter<Context> for ProvideRuntimeField<Field>
where
    Context: HasRuntimeType + HasField<Field, Field = Context::Runtime>,
{
    fn runtime(context: &Context) -> &Context::Runtime {
        context.get_field(PhantomData)
    }
}

pub type ProvideDefaultRuntimeField = ProvideRuntimeField<symbol!("runtime")>;