mtots_core 0.1.2

Core implementation of the mtots scripting language
Documentation
use super::*;

impl Value {
    pub fn format_string(mut fmt: &str, args: Vec<Value>) -> Result<String> {
        let required_argc = fmt.matches('%').count() - 2 * fmt.matches("%%").count();
        if required_argc != args.len() {
            return Err(rterr!(
                "Format string expected {} args, but got {}",
                required_argc,
                args.len()
            ));
        }
        let mut args = args.into_iter();

        let mut ret = String::new();
        while fmt.len() > 0 {
            if fmt.starts_with('%') {
                match fmt[1..].chars().next() {
                    Some('%') => ret.push('%'),
                    Some('s') => ret.push_str(&format!("{}", args.next().unwrap())),
                    Some('r') => ret.push_str(&format!("{:?}", args.next().unwrap())),
                    Some(ch) => {
                        return Err(rterr!(
                            "Invalid format char {:?} (must be one of %, s, or r)",
                            ch
                        ))
                    }
                    None => return Err(rterr!(
                        "Format string ended with a lone '%' (expected a following format character)"
                    )),
                }
                fmt = &fmt[2..];
            } else {
                let i = fmt.find('%').unwrap_or(fmt.len());
                ret.push_str(&fmt[..i]);
                fmt = &fmt[i..];
            }
        }
        Ok(ret)
    }
}