ferment-sys 0.2.14

Syntax tree morphing of FFI-compatible stuff
Documentation
use std::fmt::Debug;
use syn::{Type, Visibility};
use syn::__private::TokenStream2;
use ferment_macro::Display;
use crate::composable::FieldComposer;
use crate::composer::{FieldPathResolver, PresentableExprComposerRef};
use crate::lang::Specification;
use crate::presentable::SeqKind;

#[derive(Clone, Debug, Display)]
pub enum ArgKind<SPEC>
    where SPEC: Specification {
    AttrExhaustive(SPEC::Attr),
    AttrSequence(SeqKind<SPEC>, SPEC::Attr),
    AttrName(TokenStream2, SPEC::Attr),
    AttrExpression(SPEC::Expr, SPEC::Attr),
    AttrExpressionComposer(FieldComposer<SPEC>, FieldPathResolver<SPEC>, PresentableExprComposerRef<SPEC>),

    BindingArg(FieldComposer<SPEC>),
    BindingFieldName(FieldComposer<SPEC>),
    CallbackArg(FieldComposer<SPEC>),
    DefaultFieldConversion(FieldComposer<SPEC>),
    DefaultFieldByValueConversion(FieldComposer<SPEC>, SPEC::Expr),
    Unnamed(FieldComposer<SPEC>),
    Named(FieldComposer<SPEC>, Visibility),
    NamedReady(FieldComposer<SPEC>, Visibility),
}

impl<SPEC> ArgKind<SPEC>
    where SPEC: Specification {
    pub fn binding_arg(composer: &FieldComposer<SPEC>) -> Self {
        Self::BindingArg(composer.clone())
    }
    pub fn binding_field_name(composer: &FieldComposer<SPEC>) -> Self {
        Self::BindingFieldName(composer.clone())
    }
    pub fn callback_arg(composer: &FieldComposer<SPEC>) -> Self {
        Self::CallbackArg(composer.clone())
    }
    pub fn default_field_conversion(composer: &FieldComposer<SPEC>) -> Self {
        Self::DefaultFieldConversion(composer.clone())
    }
    pub fn default_field_type(composer: &FieldComposer<SPEC>) -> Self {
        Self::Unnamed(composer.clone())
    }
    pub fn public_named(composer: &FieldComposer<SPEC>) -> Self {
        Self::Named(composer.clone(), Visibility::Public(Default::default()))
    }
    pub fn public_named_ready(composer: &FieldComposer<SPEC>) -> Self {
        Self::NamedReady(composer.clone(), Visibility::Public(Default::default()))
    }
    pub fn inherited_named(composer: FieldComposer<SPEC>) -> Self {
        Self::Named(composer, Visibility::Inherited)
    }
    pub fn inherited_named_var(name: SPEC::Name, var: SPEC::Var, attrs: SPEC::Attr) -> Self {
        Self::inherited_named(FieldComposer::named_var(name, var, attrs))
    }
    pub fn inherited_named_type(name: SPEC::Name, ty: &Type, attrs: SPEC::Attr) -> Self {
        Self::inherited_named(FieldComposer::named_type(name, ty, attrs))
    }
    pub fn inherited_named_by_ref(composer: &FieldComposer<SPEC>) -> Self {
        Self::Named(composer.clone(), Visibility::Inherited)
    }
    pub fn inherited_named_ready(composer: &FieldComposer<SPEC>) -> Self {
        Self::NamedReady(composer.clone(), Visibility::Inherited)
    }

    pub fn attr_name(composer: &FieldComposer<SPEC>) -> Self {
        Self::AttrName(composer.tokenized_name(), composer.attrs.clone())
    }
    pub fn expr(expr: SPEC::Expr) -> Self {
        Self::AttrExpression(expr, SPEC::Attr::default())
    }
    pub fn attr_expr_composer(composer: &FieldComposer<SPEC>, field_path_resolver: FieldPathResolver<SPEC>, expr_composer: PresentableExprComposerRef<SPEC>) -> Self {
        Self::AttrExpressionComposer(composer.clone(), field_path_resolver, expr_composer)
}
    pub fn callback_ctor_pair(composer: &FieldComposer<SPEC>) -> (Self, Self) {
        (Self::CallbackArg(composer.clone()), Self::binding_field_name(composer))
    }
    pub fn unnamed_struct_ctor_pair(composer: &FieldComposer<SPEC>) -> (Self, Self) {
        (Self::binding_arg(composer), Self::binding_field_name(composer))
    }
    pub fn named_struct_ctor_pair(composer: &FieldComposer<SPEC>) -> (Self, Self) {
        (Self::inherited_named_by_ref(composer), Self::attr_name(composer))
    }
    pub fn named_ready_struct_ctor_pair(composer: &FieldComposer<SPEC>) -> (Self, Self) {
        (Self::inherited_named_ready(composer), Self::attr_name(composer))
    }
    pub fn opaque_named_struct_ctor_pair(composer: &FieldComposer<SPEC>) -> (Self, Self) {
        (Self::inherited_named_by_ref(composer), Self::default_field_conversion(composer))
    }
}