typhoon-context-macro 0.1.0-alpha.2

TODO
Documentation
mod arguments;
mod assign;
mod bumps;
mod has_one;
mod init;
mod rent;

use {
    crate::{context::Context, visitor::ContextVisitor},
    proc_macro2::TokenStream,
    syn::Field,
};
pub use {arguments::*, assign::*, bumps::*, has_one::*, init::*, rent::*};

#[derive(Default, Clone)]
pub struct GeneratorResult {
    pub global_outside: TokenStream,
    pub at_init: TokenStream,
    pub after_init: TokenStream,
    pub new_fields: Vec<Field>,
}

pub enum ConstraintGenerators {
    HasOne(HasOneGenerator),
    Init(InitializationGenerator),
    Rent(RentGenerator),
    Args(ArgumentsGenerator),
    Assign(AssignGenerator),
    Bumps(Box<BumpsGenerator>),
}

impl ConstraintGenerator for ConstraintGenerators {
    fn generate(&self) -> Result<GeneratorResult, syn::Error> {
        match self {
            ConstraintGenerators::Bumps(generator) => generator.generate(),
            ConstraintGenerators::HasOne(generator) => generator.generate(),
            ConstraintGenerators::Init(generator) => generator.generate(),
            ConstraintGenerators::Rent(generator) => generator.generate(),
            ConstraintGenerators::Args(generator) => generator.generate(),
            ConstraintGenerators::Assign(generator) => generator.generate(),
        }
    }
}

impl ContextVisitor for ConstraintGenerators {
    fn visit_context(&mut self, context: &Context) -> Result<(), syn::Error> {
        match self {
            ConstraintGenerators::Bumps(generator) => generator.visit_context(context),
            ConstraintGenerators::HasOne(generator) => generator.visit_context(context),
            ConstraintGenerators::Init(generator) => generator.visit_context(context),
            ConstraintGenerators::Rent(generator) => generator.visit_context(context),
            ConstraintGenerators::Args(generator) => generator.visit_context(context),
            ConstraintGenerators::Assign(generator) => generator.visit_context(context),
        }
    }
}

pub trait ConstraintGenerator: ContextVisitor + Sized {
    fn generate(&self) -> Result<GeneratorResult, syn::Error>;
}