Can generate examples

This commit is contained in:
Pierre HUBERT 2023-02-28 15:56:35 +01:00
parent 14c1955b15
commit 208d87df79
2 changed files with 45 additions and 1 deletions

View File

@ -1,6 +1,7 @@
use okapi::openapi3::{Components, OpenApi, SchemaObject}; use okapi::openapi3::{Components, OpenApi, SchemaObject};
use okapi::schemars::schema::{InstanceType, Schema, SingleOrVec}; use okapi::schemars::schema::{InstanceType, Schema, SingleOrVec};
use serde_json::Value; use serde_json::{json, Value};
use std::collections::HashMap;
fn recurse_fix(mut v: &mut Value) { fn recurse_fix(mut v: &mut Value) {
match &mut v { match &mut v {
@ -209,6 +210,43 @@ impl TreeNode {
} }
} }
/// Get JSON example value
pub fn example_value(&self) -> Value {
match &self.r#type {
NodeType::Null => Value::Null,
NodeType::Boolean => {
Value::Bool(self.examples.first().map(|e| e == "true").unwrap_or(false))
}
NodeType::Array { item } => Value::Array(vec![item.example_value()]),
NodeType::Object { children, .. } => {
json!(children
.iter()
.map(|c| (c.name.clone(), c.node.example_value()))
.collect::<HashMap<String, serde_json::Value>>())
}
NodeType::String => Value::String(
self.examples
.first()
.map(|s| s.as_str().trim_matches('"'))
.unwrap_or("string")
.to_string(),
),
NodeType::Number => serde_json::json!(self
.examples
.first()
.map(|s| s.parse::<f64>().expect("Failed to parse f64"))
.unwrap_or(1.)),
NodeType::Integer => serde_json::json!(self
.examples
.first()
.map(|s| s.parse::<u64>().expect("Failed to parse f64"))
.unwrap_or(0)),
}
}
/// Turn object into JSON schema /// Turn object into JSON schema
pub fn json_schema(&self) -> Value { pub fn json_schema(&self) -> Value {
valico::json_schema::builder::schema(|s| self.json_schema_inner(s)).into_json() valico::json_schema::builder::schema(|s| self.json_schema_inner(s)).into_json()

View File

@ -37,6 +37,9 @@ enum Action {
/// Dump JSON schema /// Dump JSON schema
JsonSchema, JsonSchema,
/// Dump JSON example
JsonExample,
/// Dump as Graphviz graph /// Dump as Graphviz graph
Graph, Graph,
@ -80,6 +83,9 @@ fn main() {
Action::Graph => println!("{}", graphviz_export(&tree)), Action::Graph => println!("{}", graphviz_export(&tree)),
Action::Tex { .. } => println!("{}", tex_export(&tree)), Action::Tex { .. } => println!("{}", tex_export(&tree)),
Action::JsonSchema => println!("{}", json_schema(&tree)), Action::JsonSchema => println!("{}", json_schema(&tree)),
Action::JsonExample => {
println!("{}", serde_json::to_string(&tree.example_value()).unwrap())
}
} }
} }