use super::{FieldSchema, FieldType, QuillConfig};
use crate::value::QuillValue;
pub fn build_transform_schema(config: &QuillConfig) -> QuillValue {
fn field_to_schema(field: &FieldSchema) -> serde_json::Value {
let mut schema = serde_json::Map::new();
match field.r#type {
FieldType::String => {
schema.insert(
"type".to_string(),
serde_json::Value::String("string".to_string()),
);
}
FieldType::Markdown => {
schema.insert(
"type".to_string(),
serde_json::Value::String("string".to_string()),
);
schema.insert(
"contentMediaType".to_string(),
serde_json::Value::String("text/markdown".to_string()),
);
}
FieldType::Number => {
schema.insert(
"type".to_string(),
serde_json::Value::String("number".to_string()),
);
}
FieldType::Integer => {
schema.insert(
"type".to_string(),
serde_json::Value::String("integer".to_string()),
);
}
FieldType::Boolean => {
schema.insert(
"type".to_string(),
serde_json::Value::String("boolean".to_string()),
);
}
FieldType::Array => {
schema.insert(
"type".to_string(),
serde_json::Value::String("array".to_string()),
);
if let Some(items) = &field.items {
schema.insert("items".to_string(), field_to_schema(items));
}
}
FieldType::Object => {
schema.insert(
"type".to_string(),
serde_json::Value::String("object".to_string()),
);
if let Some(properties) = &field.properties {
let mut props = serde_json::Map::new();
for (name, prop) in properties {
props.insert(name.clone(), field_to_schema(prop));
}
schema.insert("properties".to_string(), serde_json::Value::Object(props));
}
}
FieldType::Date => {
schema.insert(
"type".to_string(),
serde_json::Value::String("string".to_string()),
);
schema.insert(
"format".to_string(),
serde_json::Value::String("date".to_string()),
);
}
FieldType::DateTime => {
schema.insert(
"type".to_string(),
serde_json::Value::String("string".to_string()),
);
schema.insert(
"format".to_string(),
serde_json::Value::String("date-time".to_string()),
);
}
}
serde_json::Value::Object(schema)
}
let mut properties = serde_json::Map::new();
for (name, field) in &config.main().fields {
properties.insert(name.clone(), field_to_schema(field));
}
properties.insert(
"BODY".to_string(),
serde_json::json!({ "type": "string", "contentMediaType": "text/markdown" }),
);
let mut defs = serde_json::Map::new();
for card in config.card_definitions() {
let mut card_properties = serde_json::Map::new();
for (name, field) in &card.fields {
card_properties.insert(name.clone(), field_to_schema(field));
}
defs.insert(
format!("{}_card", card.name),
serde_json::json!({
"type": "object",
"properties": card_properties,
}),
);
}
QuillValue::from_json(serde_json::json!({
"type": "object",
"properties": properties,
"$defs": defs,
}))
}