use std::collections::HashMap;
use syn::{Error, Result, Type, TypePath};
#[derive(Debug, Clone)]
pub struct TypeInfo {
pub name: String,
pub fields: Vec<FieldInfo>,
}
#[derive(Debug, Clone)]
pub struct FieldInfo {
pub xml_name: String,
pub field_type: String,
pub optional: bool,
}
pub fn analyze_type(ty: &Type) -> Result<TypeInfo> {
match ty {
Type::Path(type_path) => {
let type_name = extract_type_name(type_path);
Ok(TypeInfo {
name: type_name,
fields: vec![], })
}
_ => Err(Error::new_spanned(
ty,
"Only named types are supported for SOAP operations",
)),
}
}
fn extract_type_name(type_path: &TypePath) -> String {
type_path
.path
.segments
.last()
.map(|segment| segment.ident.to_string())
.unwrap_or_else(|| "Unknown".to_string())
}
pub fn collect_types_from_operations(
operations: &[crate::parser::SoapOperation],
) -> Result<HashMap<String, TypeInfo>> {
let mut types = HashMap::new();
for operation in operations {
let request_type_info = analyze_type(&operation.request_type)?;
types.insert(request_type_info.name.clone(), request_type_info);
let response_type_info = analyze_type(&operation.response_type)?;
types.insert(response_type_info.name.clone(), response_type_info);
}
Ok(types)
}