use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RouteMetadata {
pub method: String,
pub path: String,
pub function_name: String,
pub module_path: String,
pub file_path: String,
pub signature: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_status: Option<Vec<u16>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StructMetadata {
pub name: String,
pub definition: String,
#[serde(default = "default_include_in_openapi")]
pub include_in_openapi: bool,
}
fn default_include_in_openapi() -> bool {
true
}
impl Default for StructMetadata {
fn default() -> Self {
Self {
name: String::new(),
definition: String::new(),
include_in_openapi: true, }
}
}
impl StructMetadata {
pub fn new(name: String, definition: String) -> Self {
Self {
name,
definition,
include_in_openapi: true,
}
}
pub fn new_model(name: String, definition: String) -> Self {
Self {
name,
definition,
include_in_openapi: false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectedMetadata {
pub routes: Vec<RouteMetadata>,
pub structs: Vec<StructMetadata>,
}
impl CollectedMetadata {
pub fn new() -> Self {
Self {
routes: Vec::new(),
structs: Vec::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_struct_metadata_new() {
let meta = StructMetadata::new("User".to_string(), "struct User {}".to_string());
assert_eq!(meta.name, "User");
assert_eq!(meta.definition, "struct User {}");
assert!(meta.include_in_openapi); }
#[test]
fn test_struct_metadata_new_model() {
let meta = StructMetadata::new_model("Model".to_string(), "struct Model {}".to_string());
assert_eq!(meta.name, "Model");
assert_eq!(meta.definition, "struct Model {}");
assert!(!meta.include_in_openapi); }
#[test]
fn test_struct_metadata_default() {
let meta = StructMetadata::default();
assert_eq!(meta.name, "");
assert_eq!(meta.definition, "");
assert!(meta.include_in_openapi); }
#[test]
fn test_struct_metadata_serde_with_include_in_openapi() {
let json = r#"{"name":"User","definition":"struct User {}","include_in_openapi":false}"#;
let meta: StructMetadata = serde_json::from_str(json).unwrap();
assert_eq!(meta.name, "User");
assert!(!meta.include_in_openapi);
}
#[test]
fn test_struct_metadata_serde_without_include_in_openapi() {
let json = r#"{"name":"User","definition":"struct User {}"}"#;
let meta: StructMetadata = serde_json::from_str(json).unwrap();
assert_eq!(meta.name, "User");
assert!(meta.include_in_openapi); }
#[test]
fn test_struct_metadata_roundtrip() {
let original =
StructMetadata::new("Test".to_string(), "struct Test { x: i32 }".to_string());
let json = serde_json::to_string(&original).unwrap();
let restored: StructMetadata = serde_json::from_str(&json).unwrap();
assert_eq!(original.name, restored.name);
assert_eq!(original.definition, restored.definition);
assert_eq!(original.include_in_openapi, restored.include_in_openapi);
}
#[test]
fn test_collected_metadata_new() {
let meta = CollectedMetadata::new();
assert!(meta.routes.is_empty());
assert!(meta.structs.is_empty());
}
}