aimdb_codegen/lib.rs
1//! AimDB Codegen — architecture state to Mermaid and Rust source
2//!
3//! This library reads `.aimdb/state.toml` (the architecture agent's decision
4//! record) and emits two artefacts:
5//!
6//! - **Mermaid diagram** — `.aimdb/architecture.mermaid`, a read-only graph
7//! projection of the architecture (see [`generate_mermaid`])
8//! - **Rust source** — `src/generated_schema.rs`, compilable AimDB schema
9//! using the actual 0.5.x API (see [`generate_rust`])
10//!
11//! # Usage
12//!
13//! ```rust
14//! use aimdb_codegen::{ArchitectureState, generate_mermaid, generate_rust, validate};
15//!
16//! let toml = r#"
17//! [meta]
18//! aimdb_version = "0.5.0"
19//! created_at = "2026-02-22T14:00:00Z"
20//! last_modified = "2026-02-22T14:00:00Z"
21//!
22//! [[records]]
23//! name = "Temperature"
24//! buffer = "SpmcRing"
25//! capacity = 128
26//! key_prefix = "sensor."
27//! key_variants = ["room1"]
28//! producers = ["sensor_task"]
29//! consumers = ["dashboard"]
30//!
31//! [[records.fields]]
32//! name = "celsius"
33//! type = "f64"
34//! description = "Temperature in Celsius"
35//! "#;
36//!
37//! let state = ArchitectureState::from_toml(toml).unwrap();
38//!
39//! let errors = validate(&state);
40//! assert!(errors.iter().all(|e| e.severity != validate::Severity::Error));
41//!
42//! let mermaid = generate_mermaid(&state);
43//! assert!(mermaid.contains("flowchart LR"));
44//!
45//! let rust = generate_rust(&state);
46//! assert!(rust.contains("pub struct TemperatureValue"));
47//! ```
48
49pub mod mermaid;
50pub mod rust;
51pub mod state;
52pub mod validate;
53
54// ── Convenience re-exports ────────────────────────────────────────────────────
55
56pub use mermaid::generate_mermaid;
57pub use rust::{
58 generate_binary_cargo_toml, generate_cargo_toml, generate_hub_cargo_toml, generate_hub_main_rs,
59 generate_hub_schema_rs, generate_hub_tasks_rs, generate_lib_rs, generate_main_rs,
60 generate_rust, generate_schema_rs, generate_tasks_rs,
61};
62pub use rust::{to_pascal_case, to_snake_case};
63pub use state::{
64 ArchitectureState, BinaryDef, BufferType, ConnectorDef, ConnectorDirection, DecisionEntry,
65 ExternalConnectorDef, FieldDef, Meta, ObservableDef, ProjectDef, RecordDef, SerializationType,
66 TaskDef, TaskIo, TaskType,
67};
68pub use validate::{is_valid, validate, Severity, ValidationError};