use serde_json::Value;
const PROJECT_SCHEMA_JSON: &str = include_str!("project.schema.json");
pub fn get_project_schema() -> Value {
serde_json::from_str(PROJECT_SCHEMA_JSON).expect("bundled project schema should be valid JSON")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_project_schema_parses_and_requires_only_name_and_version() {
let schema = get_project_schema();
let required: Vec<&str> = schema["required"]
.as_array()
.expect("project schema should have a top-level `required` array")
.iter()
.filter_map(Value::as_str)
.collect();
assert_eq!(required, vec!["name", "version"]);
}
#[test]
fn get_project_schema_behaviors_requires_active_not_default() {
let schema = get_project_schema();
let behaviors_ref = schema["properties"]["behaviors"]["anyOf"][0]["$ref"]
.as_str()
.expect("behaviors should be an anyOf with a $ref variant");
let def_name = behaviors_ref
.rsplit('/')
.next()
.expect("$ref should have a final segment");
let behaviors = &schema["$defs"][def_name];
assert!(behaviors["properties"].get("active").is_some());
assert!(behaviors["properties"].get("default").is_none());
}
#[test]
fn get_project_schema_still_accepts_legacy_nodes_arrays() {
let schema = get_project_schema();
assert!(schema["properties"]["nodes"]["properties"].get("drivers").is_some());
assert!(schema["definitions"].get("node").is_some());
}
}