apollo-language-server 0.6.0

A GraphQL language server with first-class support for Apollo Federation
Documentation
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
#[serde(tag = "kind", content = "data", rename_all = "snake_case")]
pub(crate) enum TelemetryEvent {
    Analytics(AnalyticsEvent),
}

// Define the AnalyticsEvent enum with its variants
#[derive(Serialize, Deserialize)]
#[serde(tag = "action", rename_all = "snake_case")]
pub(crate) enum AnalyticsEvent {
    Initialized,
    CompositionTimeInMs(CompositionTiming),
}

#[derive(Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub(crate) struct CompositionTiming {
    pub(crate) value: u64,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_serialize_initialized_event() {
        let event = TelemetryEvent::Analytics(AnalyticsEvent::Initialized);
        let serialized = serde_json::to_string(&event).unwrap();
        assert_eq!(
            serialized,
            r#"{"kind":"analytics","data":{"action":"initialized"}}"#
        );
    }

    #[test]
    fn test_serialize_composition_timing_event() {
        let event =
            TelemetryEvent::Analytics(AnalyticsEvent::CompositionTimeInMs(CompositionTiming {
                value: 42,
            }));
        let serialized = serde_json::to_string(&event).unwrap();
        assert_eq!(
            serialized,
            r#"{"kind":"analytics","data":{"action":"composition_time_in_ms","value":42}}"#
        );
    }
}