#![allow(dead_code)]
use crate::{Rc, Schema, Value, Vec};
use alloc::collections::BTreeMap;
use serde::Deserialize;
mod deserialize;
mod error;
mod resource_schema_selector;
type String = Rc<str>;
use deserialize::{deserialize_effects, deserialize_resource_schemas};
pub use error::TargetError;
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Target {
pub name: String,
pub description: Option<String>,
pub version: String,
#[serde(deserialize_with = "deserialize_resource_schemas")]
pub resource_schemas: Vec<Rc<Schema>>,
pub resource_schema_selector: String,
#[serde(deserialize_with = "deserialize_effects")]
pub effects: BTreeMap<String, Rc<Schema>>,
#[serde(skip)]
pub resource_schema_lookup: BTreeMap<Value, Rc<Schema>>,
#[serde(skip)]
pub default_resource_schema: Option<Rc<Schema>>,
}
impl Target {
pub fn from_json_str(json: &str) -> Result<Self, TargetError> {
let mut target: Target = serde_json::from_str(json).map_err(TargetError::from)?;
if target.resource_schemas.is_empty() {
return Err(TargetError::EmptyResourceSchemas(
"Target must have at least one resource schema defined".into(),
));
}
if target.effects.is_empty() {
return Err(TargetError::EmptyEffectSchemas(
"Target must have at least one effect defined".into(),
));
}
resource_schema_selector::populate_target_lookup_fields(&mut target)?;
Ok(target)
}
}
#[cfg(test)]
mod tests {
mod deserialize;
}