interactive_parse/
traits.rs1use std::cell::Cell;
2
3use schemars::{schema_for, JsonSchema};
4use serde::de::DeserializeOwned;
5use serde_json::Value;
6
7use crate::{error::SchemaResult, parse_schema};
8
9pub trait InteractiveParseVal
10where
11 Self: Sized,
12{
13 fn parse_to_val() -> SchemaResult<Value>;
14}
15
16impl<T> InteractiveParseVal for T
17where
18 T: JsonSchema,
19{
20 fn parse_to_val() -> SchemaResult<Value> {
21 let root_schema = schema_for!(T);
22 let name = String::default();
23 let mut title = None;
24 if let Some(metadata) = &root_schema.schema.metadata {
25 if let Some(title_ref) = &metadata.title {
26 title = Some(title_ref.clone());
27 }
28 }
29
30 let value = parse_schema(
31 &root_schema.definitions,
32 title,
33 name,
34 root_schema.schema,
35 &Cell::new(0),
36 )?;
37
38 Ok(value)
39 }
40}
41
42pub trait InteractiveParseObj
43where
44 Self: Sized,
45{
46 fn parse_to_obj() -> SchemaResult<Self>;
47}
48
49impl<T> InteractiveParseObj for T
50where
51 T: JsonSchema + DeserializeOwned,
52{
53 fn parse_to_obj() -> SchemaResult<Self> {
54 let value = Self::parse_to_val()?;
55 let my_struct = serde_json::from_value::<T>(value.clone()).map_err(|e| {
56 crate::error::SchemaError::Serde {
57 value,
58 serde_error: e,
59 }
60 })?;
61 Ok(my_struct)
62 }
63}