mecha10-templates 0.6.2

Mecha10 project templates — code generation, init, and template services
Documentation
//! Type definition templates

use crate::templates::common::{pascal_triplet, timestamped_type_template};

/// Generate message type template
pub fn message_type(name: &str) -> String {
    timestamped_type_template(name, "Message")
}

/// Generate event type template
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
    )
}

/// Generate state type template
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 {"));
    }
}