Skip to content

Implement derive_provider macros #30

@soareschen

Description

@soareschen

Summary

The derive_provider macros would allow trait-generic providers to be automatically implemented following similar boilerplates. Below are some examples:

WithProvider

#[derive_provider(WithProvider)]
#[cgp_component { name: NameTypeComponent, provider: ProvideNameType }]
pub trait HasNameType {
  type Name;
}

would have the following derived:

impl<Context, Provider, Type> ProvideNameType<Context> for WithProvider<Provider>
where
  Provider: ProvideType<NameTypeComponent, Type = Name>,
{
  type Name = Name;
}

UseContext

#[derive_provider(UseContext)]
#[cgp_component { provider: NameGetter }]
pub trait HasName {
  fn get_name(&self) -> &String;
}

would have the following derived:

impl<Context> NameGetter<Context> for UseContext
where
  Context: HasName,
{
  fn get_name(context: &Context) -> &String {
    context.get_name()
  }
}

UseField

#[derive_provider(UseField)]
#[cgp_component { provider: NameGetter }]
pub trait HasName {
  fn get_name(&self) -> &String;
}

Would have the following derived:

impl<Context, Tag> NameGetter<Context> for UseField<Tag>
where
  Context: HasField<Tag, Value = String>,
{
  fn get_name(context: &Context) -> &String {
    context.get_field(PhantomData)
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions