robotrt-cli 0.1.0-beta.2

RobotRT modular robotics runtime and middleware components.
use super::*;

pub(in crate::commands::sdk) fn render_cargo_toml(
    project_name: &str,
    workspace_root: &Path,
) -> String {
    let core_api_path = workspace_root
        .join("crates/core-api")
        .to_string_lossy()
        .to_string();
    let data_model_path = workspace_root
        .join("crates/data-model")
        .to_string_lossy()
        .to_string();

    format!(
        "[package]\nname = \"{}\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncore-api = {{ path = \"{}\" }}\ndata-model = {{ path = \"{}\" }}\n",
        project_name, core_api_path, data_model_path
    )
}

pub(in crate::commands::sdk) fn render_readme(project_name: &str, template: &str) -> String {
    format!(
        "# {}\n\nGenerated by `robotrt-cli sdk init`.\n\n## Template\n\n- {}\n\n## Run\n\n```bash\ncargo run\n```\n",
        project_name, template
    )
}

pub(in crate::commands::sdk) fn render_robotrt_config(
    project_name: &str,
    template: &str,
) -> String {
    format!(
        "[project]\nname = \"{}\"\ntemplate = \"{}\"\n",
        project_name, template
    )
}

pub(in crate::commands::sdk) fn render_main_rs(project_name: &str, template: &str) -> String {
    match template {
        "action" => render_action_template(project_name),
        "mission" => render_mission_template(project_name),
        "service" => render_service_template(project_name),
        "network" => render_network_template(project_name),
        _ => render_local_template(project_name),
    }
}

pub(in crate::commands::sdk) fn render_local_template(project_name: &str) -> String {
    format!(
        "use core_api::{{BasicNode, Publisher, QosProfile, Subscriber}};\nuse data_model::SchemaDescriptor;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {{\n    let node = BasicNode::new(\"{0}\", \"/{0}\");\n    let schema = SchemaDescriptor::new(\"demo.counter\", 1, \"demo.counter\");\n    let qos = QosProfile {{ reliable: true, depth: 16 }};\n\n    let mut publisher = node.create_publisher::<u32>(\"counter\", schema.clone(), qos);\n    let mut subscriber = node.create_subscriber::<u32>(\"counter\", schema, qos);\n\n    publisher.publish(1)?;\n    if let Some(value) = subscriber.recv()? {{\n        println!(\"received counter={{}}\", value);\n    }}\n\n    Ok(())\n}}\n",
        project_name,
    )
}

pub(in crate::commands::sdk) fn render_network_template(project_name: &str) -> String {
    format!(
        "use core_api::{{BasicNode, Node}};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {{\n    let node = BasicNode::new(\"{0}\", \"/{0}\");\n\n    println!(\"node={{}} namespace={{}}\", node.name(), node.namespace());\n    println!(\"network template scaffold created; attach transport-network adapter in your runtime bootstrap.\");\n\n    Ok(())\n}}\n",
        project_name,
    )
}

pub(in crate::commands::sdk) fn render_mission_template(project_name: &str) -> String {
    format!(
        "use core_api::{{BasicNode, Node}};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {{\n    let node = BasicNode::new(\"{0}\", \"/{0}\");\n\n    println!(\"node={{}} namespace={{}}\", node.name(), node.namespace());\n    println!(\"mission template scaffold created; add MissionSession workflow and recovery policy next.\");\n\n    Ok(())\n}}\n",
        project_name,
    )
}

pub(in crate::commands::sdk) fn render_service_template(project_name: &str) -> String {
    format!(
        "use core_api::{{BasicNode, Node}};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {{\n    let node = BasicNode::new(\"{0}\", \"/{0}\");\n\n    println!(\"node={{}} namespace={{}}\", node.name(), node.namespace());\n    println!(\"service template scaffold created; register ServiceServer and client retry policy next.\");\n\n    Ok(())\n}}\n",
        project_name,
    )
}

pub(in crate::commands::sdk) fn render_action_template(project_name: &str) -> String {
    format!(
        "use core_api::{{BasicNode, Node}};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {{\n    let node = BasicNode::new(\"{0}\", \"/{0}\");\n\n    println!(\"node={{}} namespace={{}}\", node.name(), node.namespace());\n    println!(\"action template scaffold created; wire ActionClient/ActionServer and timeout policy next.\");\n\n    Ok(())\n}}\n",
        project_name,
    )
}