Skip to main content

intent_render/
lib.rs

1pub mod html;
2pub mod markdown;
3
4use intent_parser::ast;
5
6/// Format a [`TypeExpr`] as a human-readable string.
7pub fn format_type(ty: &ast::TypeExpr) -> String {
8    let base = match &ty.ty {
9        ast::TypeKind::Simple(name) => name.clone(),
10        ast::TypeKind::Union(variants) => variants
11            .iter()
12            .map(|v| match v {
13                ast::TypeKind::Simple(n) => n.clone(),
14                _ => "...".to_string(),
15            })
16            .collect::<Vec<_>>()
17            .join(" | "),
18        ast::TypeKind::List(inner) => format!("List<{}>", format_type(inner)),
19        ast::TypeKind::Set(inner) => format!("Set<{}>", format_type(inner)),
20        ast::TypeKind::Map(k, v) => format!("Map<{}, {}>", format_type(k), format_type(v)),
21        ast::TypeKind::Parameterized { name, params } => {
22            let ps: Vec<String> = params
23                .iter()
24                .map(|p| format!("{}: {:?}", p.name, p.value))
25                .collect();
26            format!("{}({})", name, ps.join(", "))
27        }
28    };
29    if ty.optional {
30        format!("{}?", base)
31    } else {
32        base
33    }
34}