use std::collections::HashMap;
use crate::state::AphroditeState;
use super::{one::resolve_one, parse::find_markers};
const RECURSIVE_DEPTH:usize = 5;
pub fn resolve_recursive(
state:&mut AphroditeState,
hash_val:&str,
depth:usize,
resolved:&mut HashMap<String, String>,
visited:&mut Vec<String>,
) -> Option<String> {
if visited.contains(&hash_val.to_string()) {
return resolved.get(hash_val).cloned();
}
visited.push(hash_val.to_string());
if depth >= RECURSIVE_DEPTH {
return resolve_one(state, hash_val);
}
if let Some(cached) = resolved.get(hash_val) {
return Some(cached.clone());
}
let content = resolve_one(state, hash_val)?;
resolved.insert(hash_val.to_string(), content.clone());
let nested_markers = find_markers(&content);
if nested_markers.is_empty() {
return Some(content);
}
let mut replacements:Vec<(String, Option<String>)> = Vec::new();
for (marker, nested_hash) in &nested_markers {
let nested_content = if let Some(cached) = resolved.get(nested_hash) {
Some(cached.clone())
} else {
resolve_recursive(state, nested_hash, depth + 1, resolved, visited)
};
replacements.push((marker.clone(), nested_content));
}
let mut result = content;
for (marker, replacement) in &replacements {
if let Some(repl) = replacement {
result = result.replace(marker.as_str(), repl.as_str());
}
}
Some(result)
}