string_templater 0.1.3

A string templater to inject values in a string template.
Documentation
use serde::Serialize;
use std::collections::HashMap;

use crate::errors::StringTemplaterError;

pub fn parse_to_hashmap<T: ?Sized + Serialize>(
    value: &T,
) -> Result<HashMap<String, String>, StringTemplaterError> {
    match serde_json::to_value(value) {
        Ok(serialized) => {
            let mut map = HashMap::new();
            flatten("", &serialized, &mut map);
            Ok(map)
        }
        Err(err) => Err(StringTemplaterError::SerializeError(err.to_string())),
    }
}

fn flatten(prefix: &str, value: &serde_json::Value, map: &mut HashMap<String, String>) {
    match value {
        serde_json::Value::Object(obj) => {
            for (k, v) in obj {
                let new_prefix = if prefix.is_empty() {
                    (*k).clone()
                } else {
                    format!("{}.{}", prefix, k)
                };
                flatten(&new_prefix, v, map);
            }
        }
        serde_json::Value::Array(arr) => {
            for (i, v) in arr.iter().enumerate() {
                let new_prefix = format!("{}.{}", prefix, i);
                flatten(&new_prefix, v, map);
            }
        }
        _ => {
            let _ = match value {
                serde_json::Value::String(s) => map.insert(prefix.to_string(), s.clone()),
                _ => map.insert(prefix.to_string(), value.to_string()),
            };
        }
    }
}