camel-cli 0.12.0

Command-line interface for Apache Camel in Rust
Documentation
pub mod authorization_policy;
pub mod bean;
pub mod embedded;
pub mod processor;

use std::fmt;

#[derive(Clone, Copy, Debug, Default, PartialEq, clap::ValueEnum)]
pub enum ProfileLayout {
    Simple,
    #[default]
    Env,
}

impl fmt::Display for ProfileLayout {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            ProfileLayout::Simple => write!(f, "simple"),
            ProfileLayout::Env => write!(f, "env"),
        }
    }
}

pub struct TemplateFile {
    pub path: String,
    pub content: String,
}

pub struct TemplateContext {
    pub project_name: String,
    pub profile_layout: ProfileLayout,
}

pub trait TemplateProvider {
    fn name(&self) -> &str;
    fn files(&self, ctx: &TemplateContext)
    -> Result<Vec<TemplateFile>, Box<dyn std::error::Error>>;
}

pub fn cargo_toml(plugin_name: &str) -> String {
    format!(
        "[package]\nname = \"{plugin_name}\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[workspace]\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n[dependencies]\nwit-bindgen = \"0.57\"\n"
    )
}

pub fn plugin_toml(plugin_name: &str, plugin_type: &str) -> String {
    format!(
        "name = \"{plugin_name}\"\nversion = \"0.1.0\"\ntype = \"{plugin_type}\"\nentry = \"{plugin_name}.wasm\"\n"
    )
}

pub fn readme_md(plugin_name: &str, plugin_type: &str) -> String {
    format!(
        "# {plugin_name}\n\nWASM {plugin_type} plugin for Camel.\n\n## Build\n\n```bash\ncamel plugin build\n```\n\n## Files\n\n- `src/lib.rs`: plugin entrypoint implementing {plugin_type} Guest methods\n- `wit/`: WIT definitions used for guest bindings generation\n- `Camel.plugin.toml`: plugin metadata for Camel\n"
    )
}

pub fn gitignore() -> &'static str {
    "target\nplugins/\n"
}

pub fn to_pascal_case(name: &str) -> String {
    name.split(|c: char| !c.is_ascii_alphanumeric())
        .filter(|part| !part.is_empty())
        .map(|part| {
            let mut chars = part.chars();
            let mut out = String::new();
            if let Some(first) = chars.next() {
                out.extend(first.to_uppercase());
                out.extend(chars.flat_map(|c| c.to_lowercase()));
            }
            out
        })
        .collect()
}