chartml-core 4.0.0

ChartML core library: YAML parser, plugin system, element tree, data model
Documentation
pub mod data_source;
pub mod transform;
pub mod renderer;
pub mod resolver;

pub use data_source::{DataSource, DataSpec, FetchOptions};
pub use transform::{TransformMiddleware, TransformContext, TransformResult};
pub use renderer::{ChartRenderer, ChartConfig};
pub use resolver::{DatasourceResolver, ConnectionConfig};


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

    #[test]
    fn test_data_spec_creation() {
        let spec = DataSpec {
            provider: "inline".to_string(),
            rows: Some(vec![serde_json::json!({"x": 1})]),
            url: None,
            endpoint: None,
        };
        assert_eq!(spec.provider, "inline");
        assert!(spec.rows.is_some());
        assert_eq!(spec.rows.unwrap().len(), 1);
        assert!(spec.url.is_none());
        assert!(spec.endpoint.is_none());
    }

    #[test]
    fn test_chart_config_creation() {
        use crate::spec::VisualizeSpec;

        let visualize: VisualizeSpec = serde_yaml::from_str(
            r#"
            type: bar
            columns: month
            rows: revenue
            "#,
        )
        .unwrap();

        let config = ChartConfig {
            visualize,
            title: Some("Test Chart".to_string()),
            width: 800.0,
            height: 600.0,
            colors: vec!["#ff0000".to_string(), "#00ff00".to_string()],
            theme: crate::theme::Theme::default(),
        };
        assert_eq!(config.title, Some("Test Chart".to_string()));
        assert_eq!(config.width, 800.0);
        assert_eq!(config.height, 600.0);
        assert_eq!(config.colors.len(), 2);
    }

    #[test]
    fn test_transform_result_creation() {
        use crate::data::DataTable;

        let mut metadata = HashMap::new();
        metadata.insert("row_count".to_string(), serde_json::json!(5));

        let result = TransformResult {
            data: DataTable::from_rows(&[]).unwrap(),
            metadata,
        };
        assert!(result.data.is_empty());
        assert_eq!(result.metadata.len(), 1);
        assert_eq!(result.metadata["row_count"], serde_json::json!(5));
    }

    #[test]
    fn test_fetch_options_default() {
        let options = FetchOptions::default();
        assert!(options.cache_ttl.is_none());
    }
}