use rskit_errors::{AppError, AppResult, ErrorCode};
use schemars::{JsonSchema, SchemaGenerator};
use serde_json::Value;
use crate::{Json, SchemaDocument};
#[derive(Debug, Clone, Default)]
pub struct Options {
pub title: Option<String>,
pub description: Option<String>,
}
pub fn generate<T: JsonSchema>() -> AppResult<Json> {
generate_with::<T>(Options::default())
}
pub fn generate_document<T: JsonSchema>() -> AppResult<SchemaDocument> {
SchemaDocument::new(generate::<T>()?)
}
pub fn generate_with_options<T: JsonSchema>(opts: Options) -> AppResult<SchemaDocument> {
SchemaDocument::new(generate_with::<T>(opts)?)
}
pub fn generate_with<T: JsonSchema>(opts: Options) -> AppResult<Json> {
let schema = SchemaGenerator::default().into_root_schema_for::<T>();
let mut value = serde_json::to_value(schema).map_err(|err| {
AppError::new(
ErrorCode::Internal,
format!("failed to serialize generated JSON schema: {err}"),
)
.with_cause(err)
})?;
if let Some(obj) = value.as_object_mut() {
if let Some(title) = opts.title {
obj.insert("title".to_string(), Value::String(title));
}
if let Some(desc) = opts.description {
obj.insert("description".to_string(), Value::String(desc));
}
}
Ok(value)
}