1use schemars::schema_for;
4
5use crate::error::ReflectError;
6use crate::schema::{PrincipleCandidateBatch, SessionReflection};
7
8pub fn parse_reflection(input: &str) -> Result<SessionReflection, ReflectError> {
14 let value = parse_value(input)?;
15 let reflection: SessionReflection =
16 serde_json::from_value(value).map_err(|source| ReflectError::InvalidSchema {
17 raw: input.to_string(),
18 message: source.to_string(),
19 })?;
20 reflection
21 .validate()
22 .map_err(|message| ReflectError::InvalidSchema {
23 raw: input.to_string(),
24 message,
25 })?;
26 Ok(reflection)
27}
28
29pub fn parse_principle_candidates(input: &str) -> Result<PrincipleCandidateBatch, ReflectError> {
31 let value = parse_value(input)?;
32 let batch: PrincipleCandidateBatch =
33 serde_json::from_value(value).map_err(|source| ReflectError::InvalidSchema {
34 raw: input.to_string(),
35 message: source.to_string(),
36 })?;
37 batch
38 .validate()
39 .map_err(|message| ReflectError::InvalidSchema {
40 raw: input.to_string(),
41 message,
42 })?;
43 Ok(batch)
44}
45
46#[must_use]
48pub fn session_reflection_json_schema() -> serde_json::Value {
49 serde_json::to_value(schema_for!(SessionReflection)).expect("schema is serializable")
50}
51
52#[must_use]
54pub fn principle_candidate_batch_json_schema() -> serde_json::Value {
55 serde_json::to_value(schema_for!(PrincipleCandidateBatch)).expect("schema is serializable")
56}
57
58fn parse_value(input: &str) -> Result<serde_json::Value, ReflectError> {
59 serde_json::from_str(input).map_err(|source| ReflectError::InvalidJson {
60 raw: input.to_string(),
61 message: source.to_string(),
62 })
63}