use std::path::Path;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum GeneratorError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON serialization error: {0}")]
Json(#[from] serde_json::Error),
#[error("Missing input file: {path}")]
MissingInput { path: String },
#[error("Invalid input data: {message}")]
InvalidInput { message: String },
#[error("Code generation failed: {message}")]
CodeGeneration { message: String },
#[error("Dependency resolution failed: {message}")]
Dependency { message: String },
}
pub type GeneratorResult<T> = Result<T, GeneratorError>;
pub trait GeneratorModule {
fn name(&self) -> &str;
fn input_files(&self) -> Vec<String>;
fn output_file(&self) -> String;
fn dependencies(&self) -> Vec<String>;
fn generate(&self, input_dir: &Path, output_dir: &Path) -> GeneratorResult<()>;
fn metadata(&self) -> GeneratorMetadata {
GeneratorMetadata::default()
}
fn collect_metadata(&self, _input_dir: &Path) -> GeneratorResult<GeneratorMetadata> {
Ok(self.metadata())
}
}
#[derive(Debug, Clone, Default)]
pub struct GeneratorMetadata {
pub defined_types: Vec<String>,
pub used_types: Vec<String>,
pub has_forward_declarations: bool,
pub priority: i32,
}
#[derive(Debug, Clone)]
pub struct CodeFragment {
pub code: String,
pub metadata: GeneratorMetadata,
pub source_module: String,
}
impl CodeFragment {
pub fn new(code: impl Into<String>, source_module: impl Into<String>) -> Self {
Self {
code: code.into(),
metadata: GeneratorMetadata::default(),
source_module: source_module.into(),
}
}
pub fn with_metadata(mut self, metadata: GeneratorMetadata) -> Self {
self.metadata = metadata;
self
}
}
pub mod const_gen;
pub mod device_features_gen;
pub mod enum_gen;
pub mod extensions_builder_gen;
pub mod extensions_gen;
pub mod features_gen;
pub mod function_gen;
pub mod includes_gen;
pub mod macros_gen;
pub mod platforms_gen;
pub mod safe_commands_gen;
pub mod safe_ergonomic_gen;
pub mod safe_handles_gen;
pub mod struct_gen;
pub mod tags_gen;
pub mod type_gen;
pub use const_gen::ConstantGenerator;
pub use enum_gen::EnumGenerator;
pub use extensions_gen::ExtensionGenerator;
pub use features_gen::FeatureGenerator;
pub use function_gen::FunctionGenerator;
pub use includes_gen::IncludeGenerator;
pub use macros_gen::MacroGenerator;
pub use platforms_gen::PlatformGenerator;
pub use struct_gen::StructGenerator;
pub use tags_gen::TagGenerator;
pub use type_gen::TypeGenerator;