use schemars::schema_for;
use crate::error::ReflectError;
use crate::schema::{PrincipleCandidateBatch, SessionReflection};
pub fn parse_reflection(input: &str) -> Result<SessionReflection, ReflectError> {
let value = parse_value(input)?;
let reflection: SessionReflection =
serde_json::from_value(value).map_err(|source| ReflectError::InvalidSchema {
raw: input.to_string(),
message: source.to_string(),
})?;
reflection
.validate()
.map_err(|message| ReflectError::InvalidSchema {
raw: input.to_string(),
message,
})?;
Ok(reflection)
}
pub fn parse_principle_candidates(input: &str) -> Result<PrincipleCandidateBatch, ReflectError> {
let value = parse_value(input)?;
let batch: PrincipleCandidateBatch =
serde_json::from_value(value).map_err(|source| ReflectError::InvalidSchema {
raw: input.to_string(),
message: source.to_string(),
})?;
batch
.validate()
.map_err(|message| ReflectError::InvalidSchema {
raw: input.to_string(),
message,
})?;
Ok(batch)
}
#[must_use]
pub fn session_reflection_json_schema() -> serde_json::Value {
serde_json::to_value(schema_for!(SessionReflection)).expect("schema is serializable")
}
#[must_use]
pub fn principle_candidate_batch_json_schema() -> serde_json::Value {
serde_json::to_value(schema_for!(PrincipleCandidateBatch)).expect("schema is serializable")
}
fn parse_value(input: &str) -> Result<serde_json::Value, ReflectError> {
serde_json::from_str(input).map_err(|source| ReflectError::InvalidJson {
raw: input.to_string(),
message: source.to_string(),
})
}