Skip to main content

hub_codegen/generator/
mod.rs

1//! Code generation from IR
2
3#[cfg(feature = "typescript")]
4pub mod typescript;
5
6#[cfg(feature = "rust")]
7pub mod rust;
8
9use std::collections::HashMap;
10
11/// A warning emitted during code generation
12#[derive(Debug, Clone)]
13pub struct Warning {
14    pub location: String,
15    pub message: String,
16}
17
18impl std::fmt::Display for Warning {
19    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20        write!(f, "{}: {}", self.location, self.message)
21    }
22}
23
24/// Result of code generation
25pub struct GenerationResult {
26    /// Map of relative path -> file content
27    pub files: HashMap<String, String>,
28    /// Warnings encountered during generation
29    pub warnings: Vec<Warning>,
30    /// Map of relative path -> content hash (for cache invalidation)
31    pub file_hashes: HashMap<String, String>,
32    /// Runtime npm dependencies (name -> version range)
33    pub dependencies: HashMap<String, String>,
34    /// npm dev dependencies (name -> version range)
35    pub dev_dependencies: HashMap<String, String>,
36}
37
38/// Transport environment for generated code
39#[derive(Debug, Clone, Copy, PartialEq, Eq)]
40pub enum TransportEnv { Ws, Browser, None }
41
42/// Selector for which artifacts to generate
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
44pub enum GenerateSelector {
45    /// Generate all artifacts (default behaviour)
46    #[default]
47    All,
48    /// transport.ts only
49    Transport,
50    /// Core RPC layer: types.ts, rpc.ts, index.ts
51    Rpc,
52    /// Plugin client files: <namespace>/types.ts, <namespace>/client.ts, <namespace>/index.ts
53    Plugins,
54    /// Schema walk smoke test script (no test framework)
55    Smoke,
56    /// package.json only
57    Package,
58}
59
60/// Options for code generation
61#[derive(Debug, Clone)]
62pub struct GenerationOptions {
63    pub transport: TransportEnv,
64    /// Which artifact subset to produce
65    pub generate: GenerateSelector,
66    /// Optional plugin name filter for GenPlugins (None = all plugins)
67    pub plugins_filter: Option<Vec<String>>,
68    /// Import path for PlexusRpcClient in the smoke test (default: "../transport")
69    pub smoke_transport_path: String,
70    /// Backend WebSocket URL used as fallback in generated smoke tests
71    pub backend_url: String,
72}
73
74impl Default for GenerationOptions {
75    fn default() -> Self {
76        Self {
77            transport: TransportEnv::Ws,
78            generate: GenerateSelector::All,
79            plugins_filter: None,
80            smoke_transport_path: "../transport".to_string(),
81            backend_url: "ws://localhost:4444".to_string(),
82        }
83    }
84}