use quote::ToTokens;
use syn::{parse_quote, Fields, FieldsNamed};
use crate::cmd::scope_struct::ScopeStruct;
pub fn struct_definition(scope_struct: &mut ScopeStruct) -> proc_macro2::TokenStream {
let scope = scope_struct.scope();
scope_struct.item_struct_mut().fields = {
let mut fields: FieldsNamed = parse_quote!({});
fields::profile_and_flow_selection_push(&mut fields, scope);
fields::params_selection_push(&mut fields, scope);
fields::params_specs_push(&mut fields, scope);
Fields::from(fields)
};
scope_struct.item_struct().to_token_stream()
}
mod fields {
use syn::{parse_quote, FieldsNamed};
use crate::cmd::{FlowCount, ProfileCount, Scope};
pub fn profile_and_flow_selection_push(fields_named: &mut FieldsNamed, scope: Scope) {
match scope.profile_count() {
ProfileCount::None => {}
ProfileCount::One | ProfileCount::Multiple => {
let fields: FieldsNamed = parse_quote!({
pub(crate) profile_selection: CmdCtxBuilderTypesT::ProfileSelection
});
fields_named.named.extend(fields.named);
}
}
if scope.flow_count() == FlowCount::One {
let fields: FieldsNamed = parse_quote!({
pub(crate) flow_selection: CmdCtxBuilderTypesT::FlowSelection
});
fields_named.named.extend(fields.named);
}
}
pub fn params_selection_push(fields_named: &mut FieldsNamed, scope: Scope) {
let fields: FieldsNamed = parse_quote!({
pub(crate) params_type_regs_builder:
peace_rt_model::params::ParamsTypeRegsBuilder<CmdCtxBuilderTypesT::ParamsKeys>
});
fields_named.named.extend(fields.named);
let fields: FieldsNamed = parse_quote!({
pub(crate) workspace_params_selection: CmdCtxBuilderTypesT::WorkspaceParamsSelection
});
fields_named.named.extend(fields.named);
if scope.profile_params_supported() {
let fields: FieldsNamed = parse_quote!({
pub(crate) profile_params_selection: CmdCtxBuilderTypesT::ProfileParamsSelection
});
fields_named.named.extend(fields.named);
}
if scope.flow_params_supported() {
let fields: FieldsNamed = parse_quote!({
pub(crate) flow_params_selection: CmdCtxBuilderTypesT::FlowParamsSelection
});
fields_named.named.extend(fields.named);
}
}
pub fn params_specs_push(fields_named: &mut FieldsNamed, scope: Scope) {
if scope.flow_count() == FlowCount::One {
let fields_params_specs: FieldsNamed = parse_quote!({
pub(crate) params_specs_provided: peace_params::ParamsSpecs
});
fields_named.named.extend(fields_params_specs.named);
}
}
}