use crate::builder::AAMBuilder;
use std::collections::HashMap;
#[must_use]
pub fn split_aam(input: &str) -> HashMap<String, AAMBuilder> {
let mut result = HashMap::new();
let mut current_name: Option<String> = None;
let mut current_builder = AAMBuilder::new();
for line in input.lines() {
let trimmed = line.trim();
if trimmed.is_empty() {
continue;
}
if let Some(filename) = parse_section_header(trimmed) {
if let Some(prev_name) = current_name.take() {
let old_builder = std::mem::take(&mut current_builder);
result.insert(prev_name, old_builder);
}
current_name = Some(filename.to_owned());
continue;
}
if current_name.is_some()
&& let Some((key, value)) = parse_assignment(trimmed)
{
current_builder.add_line(key, value);
}
}
if let Some(prev_name) = current_name {
result.insert(prev_name, current_builder);
}
result
}
fn parse_section_header(s: &str) -> Option<&str> {
if let Some(without_hash) = s.strip_prefix('#') {
let rest = without_hash.trim();
if std::path::Path::new(rest)
.extension()
.is_some_and(|ext| ext.eq_ignore_ascii_case("aam"))
{
return Some(rest);
}
}
None
}
fn parse_assignment(s: &str) -> Option<(&str, &str)> {
let mut parts = s.splitn(2, '=');
let key = parts.next()?.trim();
let value = parts.next().map(str::trim)?;
if key.is_empty() {
return None;
}
Some((key, value))
}