use crate::data::DataTables;
pub fn paint(tables: &DataTables, part_name: &str, part_v: &str, theme: &str) -> String {
let colors = tables.colors_of(&format!("{}{}", part_v, theme), part_name);
let svg = tables.template_of(part_v, part_name);
let svg = match svg {
None => return String::new(),
Some(s) => s,
};
let placeholders = find_color_placeholders(svg);
let mut out = svg.to_string();
for (i, placeholder) in placeholders.iter().enumerate() {
let replacement = format!("{};", colors.map(|c| c[i].as_str()).unwrap_or("#000"));
out = out.replacen(placeholder, &replacement, 1);
}
out
}
fn find_color_placeholders(svg: &str) -> Vec<String> {
let mut v = Vec::new();
let mut rest = svg;
while let Some(pos) = rest.find('#') {
let after = &rest[pos + 1..];
match after.find(';') {
Some(semi) => {
v.push(rest[pos..pos + 1 + semi + 1].to_string());
rest = &rest[pos + 1 + semi + 1..];
}
None => break,
}
}
v
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn placeholders_replaced() {
let tables = DataTables::instance();
let out = paint(tables, "env", "00", "A");
assert!(!out.contains("#000;"));
assert!(!out.is_empty());
}
#[test]
fn missing_template_empty() {
let tables = DataTables::instance();
assert_eq!(paint(tables, "env", "99", "A"), "");
}
}