1pub mod html;
2pub mod markdown;
3
4use intent_parser::ast;
5
6pub 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}