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");
#[derive(Debug, Clone)]
pub struct Models {
pub control_plane: CliModel,
pub data_plane: CliModel,
}
pub struct ModelLoader;
impl ModelLoader {
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")?;
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");
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"
);
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"
);
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");
}
}