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,
)
}