zilliz 0.1.1

TUI and CLI tool for managing Zilliz Cloud clusters and Milvus operations
Documentation
use anyhow::{Context, Result};

use super::types::CliModel;

const CONTROL_PLANE_JSON: &str = include_str!("builtin_models/control-plane.json");
const DATA_PLANE_JSON: &str = include_str!("builtin_models/data-plane.json");

/// Both models loaded together.
#[derive(Debug, Clone)]
pub struct Models {
    pub control_plane: CliModel,
    pub data_plane: CliModel,
}

pub struct ModelLoader;

impl ModelLoader {
    /// Load the built-in JSON models embedded at compile time.
    pub fn load_builtin() -> Result<Models> {
        let control_plane: CliModel = serde_json::from_str(CONTROL_PLANE_JSON)
            .context("Failed to parse control-plane.json")?;
        let data_plane: CliModel =
            serde_json::from_str(DATA_PLANE_JSON).context("Failed to parse data-plane.json")?;

        // Inherit resource-level dedicated_only to operations
        let control_plane = Self::inherit_dedicated_only(control_plane);
        let data_plane = Self::inherit_dedicated_only(data_plane);

        Ok(Models {
            control_plane,
            data_plane,
        })
    }

    fn inherit_dedicated_only(mut model: CliModel) -> CliModel {
        for resource in model.resources.values_mut() {
            if resource.dedicated_only {
                for op in resource.operations.values_mut() {
                    op.dedicated_only = true;
                }
            }
        }
        model
    }
}

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

    #[test]
    fn test_load_builtin_models() {
        let models = ModelLoader::load_builtin().expect("Failed to load models");

        // Control plane should have cluster, project, backup, etc.
        assert!(
            models.control_plane.resources.contains_key("cluster"),
            "Missing cluster resource"
        );
        assert!(
            models.control_plane.resources.contains_key("project"),
            "Missing project resource"
        );
        assert!(
            models.control_plane.resources.contains_key("backup"),
            "Missing backup resource"
        );
        assert!(
            models.control_plane.endpoint.is_some(),
            "Control plane should have an endpoint"
        );

        // Data plane should have collection, vector, etc.
        assert!(
            models.data_plane.resources.contains_key("collection"),
            "Missing collection resource"
        );
        assert!(
            models.data_plane.resources.contains_key("vector"),
            "Missing vector resource"
        );
        assert!(
            models.data_plane.resources.contains_key("index"),
            "Missing index resource"
        );

        // Verify operation parsing
        let cluster = &models.control_plane.resources["cluster"];
        assert!(cluster.operations.contains_key("list"));
        assert!(cluster.operations.contains_key("describe"));

        let list_op = &cluster.operations["list"];
        assert_eq!(list_op.method(), "GET");
        assert_eq!(list_op.path(), "/v2/clusters");
    }
}