#[macro_export]
macro_rules! parameters {
($($name:ident: $type:ty),* $(,)?) => {{
use serde_json::json;
let mut properties = serde_json::Map::new();
$(
let property = match stringify!($type) {
"String" => json!({
"type": "string"
}),
"i32" | "i64" | "u64" | "u32" => json!({
"type": "number"
}),
"bool" => json!({
"type": "boolean"
}),
s if s.starts_with("Vec<") && s.ends_with(">") => {
let inner_type_str = &s[4..s.len() - 1];
let inner_type = match inner_type_str {
"String" => json!({
"type": "string"
}),
"i32" | "i64" | "u64" | "u32" => json!({
"type": "number"
}),
"bool" => json!({
"type": "boolean"
}),
_ => json!({
"type": "object"
}),
};
json!({
"type": "array",
"items": inner_type
})
}
_ => {
json!({
"type": "object"
})
}
};
properties.insert(stringify!($name).to_string(), property);
)*
json!({
"type": "object",
"properties": properties,
})
}};
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_parameters_with_option_string() {
let schema = parameters!(name: Option<String>);
let expected_schema = json!({
"type": "object",
"properties": {
"name": {
"type": "object" }
}
});
assert_eq!(schema, expected_schema);
}
#[test]
fn test_parameters_with_string() {
let schema = parameters!(name: String);
let expected_schema = json!({
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
});
assert_eq!(schema, expected_schema);
}
#[test]
fn test_parameters_with_i32() {
let schema = parameters!(age: i32);
let expected_schema = json!({
"type": "object",
"properties": {
"age": {
"type": "number"
}
}
});
assert_eq!(schema, expected_schema);
}
#[test]
fn test_parameters_with_vec_string() {
let schema = parameters!(tags: Vec<String>);
let expected_schema = json!({
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
}
});
assert_eq!(schema, expected_schema);
}
#[test]
fn test_parameters_with_option_i32() {
let schema = parameters!(score: Option<i32>);
let expected_schema = json!({
"type": "object",
"properties": {
"score": {
"type": "object" }
}
});
assert_eq!(schema, expected_schema);
}
#[test]
fn test_parameters_with_vec_option_bool() {
let schema = parameters!(flags: Vec<Option<bool>>);
let expected_schema = json!({
"type": "object",
"properties": {
"flags": {
"type": "array",
"items": {
"type": "object" }
}
}
});
assert_eq!(schema, expected_schema);
}
}