1use 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}