ryo-source 0.1.0

High-speed Rust AST manipulation engine
Documentation
//! Source code generation from Pure AST.
//!
//! This module provides generators that convert Pure AST structures into
//! Rust source code. Different generators support different output strategies:
//!
//! - `SingleFileGenerator`: Generates a single lib.rs/main.rs with nested `mod {}` blocks
//! - `MultiFileGenerator`: Generates multiple files following Rust module conventions
//!
//! # Architecture
//!
//! ```text
//! ModuleTree ──► SingleFileGenerator ──► PureFile ──► String (source code)
//!//!      ├── Hierarchical module structure with items
//!//!      └─► MultiFileGenerator ──► GeneratedFiles (PathBuf → GeneratedSource)
//! ```
//!
//! # Example
//!
//! ```ignore
//! use ryo_source::generator::{ModuleTree, SingleFileGenerator, MultiFileGenerator};
//!
//! let tree = ModuleTree::new("crate")
//!     .with_item(PureItem::Struct(my_struct))
//!     .with_child(ModuleTree::new("utils")
//!         .with_item(PureItem::Fn(helper_fn)));
//!
//! // Single file output
//! let generator = SingleFileGenerator::new();
//! let source = generator.generate(&tree);
//!
//! // Multi-file output
//! let generator = MultiFileGenerator::new();
//! let files = generator.generate(&tree);
//! // files.get("lib.rs"), files.get("utils.rs"), etc.
//! ```

mod multi;
mod single;
mod tree;

pub use multi::{GeneratedFiles, MultiFileGenerator};
pub use single::SingleFileGenerator;
pub use tree::ModuleTree;

use crate::pure::PureFile;

/// Result of source generation.
#[derive(Debug, Clone)]
pub struct GeneratedSource {
    /// The generated source code.
    pub source: String,
    /// The PureFile representation (for further manipulation if needed).
    pub pure_file: PureFile,
}

/// Trait for source code generators.
///
/// Generators transform a `ModuleTree` into source code, supporting
/// different output strategies (single file, multi-file, etc.).
pub trait SourceGenerator {
    /// Generate source code from a module tree.
    fn generate(&self, tree: &ModuleTree) -> Result<GeneratedSource, crate::pure::ToSynError>;
}