use super::utils::{extract_attr, find_closing_tag};
use crate::parser::openapi_parser::parse_openapi;
use crate::parser::types::*;
pub(super) fn try_parse_openapi(content: &str) -> Option<(DocNode, &str)> {
if !content.starts_with("<OpenAPI") {
return None;
}
let tag_end = content.find('>')?;
let tag_content = &content[8..tag_end];
let tags_attr = extract_attr(tag_content, "tags");
let hide_schemas = tag_content.contains("hideSchemas");
let show_schemas = !hide_schemas;
let tags = tags_attr.map(|t| t.split(',').map(|s| s.trim().to_string()).collect());
if tag_content.trim().ends_with('/') {
return None;
}
let after_open = &content[tag_end + 1..];
let close_idx = find_closing_tag(after_open, "OpenAPI")?;
let inner = after_open[..close_idx].trim();
let rest = &after_open[close_idx + "</OpenAPI>".len()..];
let spec = parse_openapi(inner).ok()?;
Some((
DocNode::OpenApi(OpenApiNode {
spec,
tags,
show_schemas,
}),
rest,
))
}