use crate::templates::common::{pascal_triplet, timestamped_type_template};
pub fn message_type(name: &str) -> String {
timestamped_type_template(name, "Message")
}
pub fn event_type(name: &str) -> String {
let (name, pascal_a, pascal_b) = pascal_triplet(name);
format!(
r#"//! {} Event Type
//!
//! Auto-generated event definition.
use serde::{{Deserialize, Serialize}};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct {} {{
pub timestamp: f64,
pub event_type: String,
// TODO: Add event fields
}}
impl {} {{
pub fn new(event_type: impl Into<String>) -> Self {{
Self {{
timestamp: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs_f64(),
event_type: event_type.into(),
}}
}}
}}
"#,
name, pascal_a, pascal_b
)
}
pub fn state_type(name: &str) -> String {
timestamped_type_template(name, "State")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn message_type_uses_message_kind() {
let generated = message_type("sensor_reading");
assert!(generated.contains("//! sensor_reading Message Type"));
assert!(generated.contains("Auto-generated message definition."));
assert!(generated.contains("pub struct SensorReading {"));
assert!(generated.contains("// TODO: Add message fields"));
assert!(generated.contains("impl Default for SensorReading {"));
}
#[test]
fn state_type_uses_state_kind() {
let generated = state_type("robot_state");
assert!(generated.contains("//! robot_state State Type"));
assert!(generated.contains("Auto-generated state definition."));
assert!(generated.contains("pub struct RobotState {"));
assert!(generated.contains("// TODO: Add state fields"));
assert!(generated.contains("impl Default for RobotState {"));
}
}