mod parent;
mod shared;
use super::model::Model;
use super::render;
use crate::database::introspection::Schema;
use crate::generators::layout::{self, Module};
use crate::generators::naming;
use std::io;
use std::path::Path;
pub use crate::generators::layout::Layout;
const ROOT: &str = "mod.rs";
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Options {
pub actix: bool,
}
pub fn write(out: &Path, schema: &Schema, force: bool) -> io::Result<Layout> {
write_with(out, schema, Options::default(), force)
}
pub fn write_with(
out: &Path,
schema: &Schema,
options: Options,
force: bool,
) -> io::Result<Layout> {
let names = naming::resolve(schema);
let models: Vec<Model> = schema
.tables
.iter()
.zip(&names)
.map(|(table, names)| Model::resolve(table, schema, names).with_actix(options.actix))
.collect();
let mut modules = shared::enums_module(&models, schema);
let model_modules: Vec<Module> = models
.iter()
.map(|model| Module {
name: model.module.clone(),
has_extra_types: false,
files: render::files(model, schema),
})
.collect();
modules.extend(shared::api_module(&model_modules, options));
modules.extend(model_modules);
layout::write(out, &modules, ROOT, parent::render, declares, force)
}
fn declares(contents: &str, name: &str) -> bool {
contents.lines().any(|line| {
let line = line.trim();
line == format!("pub mod {name};") || line == format!("mod {name};")
})
}