webfluent 0.4.0-alpha

The Web-First Language — compiles to HTML, CSS, JavaScript, and PDF. 50+ built-in components, reactivity, routing, i18n, SSG, and template engine.
Documentation
use std::fs;
use std::path::Path;
use crate::error::Result;

pub fn run_generate(kind: &str, name: &str, project_dir: &Path) -> Result<()> {
    match kind {
        "page" => generate_page(name, project_dir),
        "component" => generate_component(name, project_dir),
        "store" => generate_store(name, project_dir),
        _ => {
            eprintln!("Unknown generator '{}'. Use: page, component, or store", kind);
            Ok(())
        }
    }
}

fn generate_page(name: &str, project_dir: &Path) -> Result<()> {
    let dir = project_dir.join("src/pages");
    fs::create_dir_all(&dir)?;

    let path_slug = name.to_lowercase();
    let content = format!(r#"Page {} (path: "/{}", title: "{}") {{
    Container {{
        Heading("{}", h1)
        Text("This is the {} page.")
    }}
}}
"#, name, path_slug, name, name, name);

    let file_path = dir.join(format!("{}.wf", name));
    if file_path.exists() {
        eprintln!("Page {} already exists", name);
        return Ok(());
    }

    fs::write(&file_path, content)?;
    println!("Created page: src/pages/{}.wf", name);
    Ok(())
}

fn generate_component(name: &str, project_dir: &Path) -> Result<()> {
    let dir = project_dir.join("src/components");
    fs::create_dir_all(&dir)?;

    let content = format!(r#"Component {} () {{
    Card {{
        Text("{} component")
    }}
}}
"#, name, name);

    let file_path = dir.join(format!("{}.wf", name));
    if file_path.exists() {
        eprintln!("Component {} already exists", name);
        return Ok(());
    }

    fs::write(&file_path, content)?;
    println!("Created component: src/components/{}.wf", name);
    Ok(())
}

fn generate_store(name: &str, project_dir: &Path) -> Result<()> {
    let dir = project_dir.join("src/stores");
    fs::create_dir_all(&dir)?;

    let content = format!(r#"Store {} {{
    state items = []

    action add(item: String) {{
        items.push(item)
    }}
}}
"#, name);

    let file_name = name.to_lowercase();
    let file_path = dir.join(format!("{}.wf", file_name));
    if file_path.exists() {
        eprintln!("Store {} already exists", name);
        return Ok(());
    }

    fs::write(&file_path, content)?;
    println!("Created store: src/stores/{}.wf", file_name);
    Ok(())
}