planus_codegen/
lib.rs

1//! Library for doing code generation for types from [`planus_types`].
2//!
3//! This library is an internal implementation
4//! detail of [planus-cli](https://docs.rs/planus-cli).
5//!
6//! Feel free to use it, however there are no stability guarantees.
7
8use askama::Template;
9use planus_types::intermediate::Declarations;
10
11use crate::{
12    analysis::run_analysis, backend_translation::run_backend, dot::DotBackend, rust::RustBackend,
13};
14
15mod analysis;
16mod backend;
17mod backend_translation;
18mod dot;
19mod rust;
20mod templates;
21
22pub fn generate_rust(declarations: &Declarations) -> eyre::Result<String> {
23    let default_analysis = run_analysis(declarations, &mut rust::analysis::DefaultAnalysis);
24    let eq_analysis = run_analysis(declarations, &mut rust::analysis::EqAnalysis);
25    let infallible_analysis = run_analysis(
26        declarations,
27        &mut rust::analysis::InfallibleConversionAnalysis,
28    );
29    let output = run_backend(
30        &mut RustBackend {
31            default_analysis,
32            eq_analysis,
33            infallible_analysis,
34        },
35        declarations,
36    );
37    let res = templates::rust::Namespace(&output).render().unwrap();
38    let res = rust::format_string(&res, Some(1_000_000))?;
39    let res = rust::format_string(&res, None)?;
40    Ok(res)
41}
42
43pub fn generate_dot(declarations: &Declarations) -> String {
44    let output = run_backend(&mut DotBackend { color_seed: 0 }, declarations);
45    let res = templates::dot::Namespace(&output).render().unwrap();
46    res
47}