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, format: bool) -> 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 if format {
39 let res = rust::format_string(&res, Some(1_000_000))?;
40 let res = rust::format_string(&res, None)?;
41 Ok(res)
42 } else {
43 Ok(res)
44 }
45}
46
47pub fn generate_dot(declarations: &Declarations) -> String {
48 let output = run_backend(&mut DotBackend { color_seed: 0 }, declarations);
49 let res = templates::dot::Namespace(&output).render().unwrap();
50 res
51}