rskit_schema/
generation.rs1use rskit_errors::{AppError, AppResult, ErrorCode};
4use schemars::{JsonSchema, SchemaGenerator};
5use serde_json::Value;
6
7use crate::{Json, SchemaDocument};
8
9#[derive(Debug, Clone, Default)]
11pub struct Options {
12 pub title: Option<String>,
14 pub description: Option<String>,
16}
17
18pub fn generate<T: JsonSchema>() -> AppResult<Json> {
20 generate_with::<T>(Options::default())
21}
22
23pub fn generate_document<T: JsonSchema>() -> AppResult<SchemaDocument> {
25 SchemaDocument::new(generate::<T>()?)
26}
27
28pub fn generate_with_options<T: JsonSchema>(opts: Options) -> AppResult<SchemaDocument> {
30 SchemaDocument::new(generate_with::<T>(opts)?)
31}
32
33pub fn generate_with<T: JsonSchema>(opts: Options) -> AppResult<Json> {
35 let schema = SchemaGenerator::default().into_root_schema_for::<T>();
36 let mut value = serde_json::to_value(schema).map_err(|err| {
37 AppError::new(
38 ErrorCode::Internal,
39 format!("failed to serialize generated JSON schema: {err}"),
40 )
41 .with_cause(err)
42 })?;
43
44 if let Some(obj) = value.as_object_mut() {
45 if let Some(title) = opts.title {
46 obj.insert("title".to_string(), Value::String(title));
47 }
48 if let Some(desc) = opts.description {
49 obj.insert("description".to_string(), Value::String(desc));
50 }
51 }
52
53 Ok(value)
54}