#[cfg(feature = "plugins")]
use super::Parser;
#[cfg(feature = "plugins")]
use crate::{
parser::{
ast::Section,
errors::{IssueCategory, IssueSeverity, ParseIssue},
},
plugin::SectionResult,
Result,
};
#[cfg(feature = "plugins")]
use alloc::{format, vec::Vec};
#[cfg(feature = "plugins")]
impl<'a> Parser<'a> {
pub(super) fn try_process_with_registry(
&mut self,
section_name: &str,
start_line: usize,
) -> Option<Result<Section<'a>>> {
let registry = self.registry?;
let mut lines = Vec::new();
while self.position < self.source.len() && !self.at_next_section() {
let line_start = self.position;
let line_end = self.source[self.position..]
.find('\n')
.map_or(self.source.len(), |i| self.position + i);
if line_end > line_start {
let line = &self.source[line_start..line_end];
lines.push(line);
}
self.skip_line();
}
match registry.process_section(section_name, section_name, &lines) {
Some(SectionResult::Processed) => {
self.issues.push(ParseIssue::new(
IssueSeverity::Info,
IssueCategory::Structure,
format!("Section '{section_name}' processed by plugin"),
start_line,
));
None
}
Some(SectionResult::Failed(msg)) => {
self.issues.push(ParseIssue::new(
IssueSeverity::Warning,
IssueCategory::Structure,
format!("Plugin failed to process section '{section_name}': {msg}"),
start_line,
));
None
}
Some(SectionResult::Ignored) | None => None,
}
}
}