interactive_parse/
traits.rs

1use 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}