use super::CodegenConfig;
use crate::codegen::postprocessing::post_process_generation;
use crate::codegen::string_format::attribute::code_attribute;
use crate::codegen::string_format::code_string_concept;
use crate::codegen::string_format::tao::code_tao;
use crate::codegen::string_format::{AttributeFormatConfig, FormatConfig};
use crate::tao::ImplementConfig;
use std::collections::HashMap;
use std::rc::Rc;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StructConfig {
pub name: String,
pub import: String,
}
impl Default for StructConfig {
fn default() -> Self {
Self {
name: "Tao".to_owned(),
import: "zamm_yin::tao::Tao".to_owned(),
}
}
}
pub struct CodeConfig<'a> {
pub name: Rc<String>,
pub parent: StructConfig,
pub activate_attribute: bool,
pub all_attributes: Vec<StructConfig>,
pub introduced_attributes: Vec<StructConfig>,
pub attribute_structs: HashMap<&'a str, StructConfig>,
pub impl_cfg: ImplementConfig,
pub codegen_cfg: CodegenConfig,
}
impl<'a> Default for CodeConfig<'a> {
fn default() -> Self {
Self {
name: Rc::new("dummy".to_owned()),
parent: StructConfig::default(),
activate_attribute: false,
all_attributes: Vec::default(),
introduced_attributes: Vec::default(),
attribute_structs: HashMap::default(),
impl_cfg: ImplementConfig::default(),
codegen_cfg: CodegenConfig::default(),
}
}
}
pub fn code(cfg: &CodeConfig) -> String {
let initial_code = if cfg.activate_attribute {
code_attribute(&AttributeFormatConfig::from(cfg))
} else if cfg.parent.name.to_lowercase() == "data" {
code_string_concept(&FormatConfig::from(cfg))
} else {
code_tao(&FormatConfig::from(cfg))
};
post_process_generation(&initial_code, &cfg.codegen_cfg)
}