use crate::{Context, PipelineArguments};
use crate::check::ast::ASTTy;
use crate::generate::ast::node::Core;
use crate::generate::convert::convert_node;
use crate::generate::convert::state::{Imports, State};
use crate::generate::result::GenResult;
mod convert;
pub mod ast;
pub mod name;
pub mod result;
#[derive(Default)]
pub struct GenArguments {
pub annotate: bool,
}
impl From<&PipelineArguments> for GenArguments {
fn from(pipeline_args: &PipelineArguments) -> Self {
GenArguments { annotate: pipeline_args.annotate }
}
}
pub fn gen_arguments(ast_ty: &ASTTy, gen_args: &GenArguments, ctx: &Context) -> GenResult {
let state = State::from(gen_args);
let import = &mut Imports::new();
match convert_node(ast_ty, import, &state, ctx)? {
Core::Block { statements } => {
Ok(Core::Block { statements: import.imports().into_iter().chain(statements).collect() })
}
other if !import.is_empty() => {
Ok(Core::Block { statements: import.imports().into_iter().chain(vec![other]).collect() })
}
other => Ok(other)
}
}
pub fn gen(ast_ty: &ASTTy) -> GenResult {
gen_arguments(ast_ty, &GenArguments::default(), &Context::default())
}