mirror of
https://github.com/kjuulh/dagger-rs.git
synced 2024-12-02 11:13:09 +01:00
115 lines
3.5 KiB
Rust
115 lines
3.5 KiB
Rust
|
pub mod format;
|
||
|
mod functions;
|
||
|
pub mod templates;
|
||
|
|
||
|
use std::sync::{Arc, Mutex};
|
||
|
|
||
|
use dagger_core::introspection::Schema;
|
||
|
use eyre::Context;
|
||
|
use genco::prelude::rust;
|
||
|
|
||
|
use crate::functions::CommonFunctions;
|
||
|
use crate::generator::Generator;
|
||
|
use crate::visitor::{VisitHandlers, Visitor};
|
||
|
|
||
|
use self::format::FormatTypeFunc;
|
||
|
use self::templates::enum_tmpl::render_enum;
|
||
|
use self::templates::input_tmpl::render_input;
|
||
|
use self::templates::object_tmpl::render_object;
|
||
|
use self::templates::scalar_tmpl::render_scalar;
|
||
|
|
||
|
pub struct RustGenerator {}
|
||
|
|
||
|
impl Generator for RustGenerator {
|
||
|
fn generate(&self, schema: Schema) -> eyre::Result<String> {
|
||
|
let render = Arc::new(Mutex::new(rust::Tokens::new()));
|
||
|
let common_funcs = Arc::new(CommonFunctions::new(Arc::new(FormatTypeFunc {})));
|
||
|
println!("generating dagger for rust");
|
||
|
|
||
|
let visitor = Visitor {
|
||
|
schema,
|
||
|
handlers: VisitHandlers {
|
||
|
visit_scalar: Arc::new({
|
||
|
let render = render.clone();
|
||
|
let common_funcs = common_funcs.clone();
|
||
|
|
||
|
move |t| {
|
||
|
println!("generating scalar");
|
||
|
let rendered_scalar = render_scalar(t)?;
|
||
|
|
||
|
let mut render = render.lock().unwrap();
|
||
|
|
||
|
render.append(rendered_scalar);
|
||
|
render.push();
|
||
|
|
||
|
println!("generated scalar");
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
}),
|
||
|
visit_object: Arc::new({
|
||
|
let render = render.clone();
|
||
|
let common_funcs = common_funcs.clone();
|
||
|
|
||
|
move |t| {
|
||
|
println!("generating object");
|
||
|
let rendered_scalar = render_object(&common_funcs, t)?;
|
||
|
|
||
|
let mut render = render.lock().unwrap();
|
||
|
|
||
|
render.append(rendered_scalar);
|
||
|
render.push();
|
||
|
println!("generated object");
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
}),
|
||
|
visit_input: Arc::new({
|
||
|
let render = render.clone();
|
||
|
let common_funcs = common_funcs.clone();
|
||
|
|
||
|
move |t| {
|
||
|
println!("generating input");
|
||
|
let rendered_scalar = render_input(&common_funcs, t)?;
|
||
|
|
||
|
let mut render = render.lock().unwrap();
|
||
|
|
||
|
render.append(rendered_scalar);
|
||
|
render.push();
|
||
|
println!("generated input");
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
}),
|
||
|
visit_enum: Arc::new({
|
||
|
let render = render.clone();
|
||
|
let common_funcs = common_funcs.clone();
|
||
|
|
||
|
move |t| {
|
||
|
println!("generating enum");
|
||
|
let rendered_scalar = render_enum(t)?;
|
||
|
|
||
|
let mut render = render.lock().unwrap();
|
||
|
|
||
|
render.append(rendered_scalar);
|
||
|
render.push();
|
||
|
println!("generated enum");
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
}),
|
||
|
},
|
||
|
};
|
||
|
|
||
|
visitor.run()?;
|
||
|
|
||
|
println!("done generating objects");
|
||
|
|
||
|
let rendered = render.lock().unwrap();
|
||
|
|
||
|
rendered
|
||
|
.to_file_string()
|
||
|
.context("could not render to file string")
|
||
|
}
|
||
|
}
|