rssg 1.7.3

A rusty static-site generator leveraging shell commands.
use std::collections::HashMap;

use crate::error::*;
use crate::field;
use crate::filter::Filter;

pub fn parse_filter(filter: &toml::Table) -> ParseResult<(Filter, Option<String>)> {
    let name = if let Some(toml::Value::String(s)) = &filter.get("name") {
        Some(s.clone())
    } else {
        None
    };

    let command = field!(filter, command, String).clone();
    let outfile = if let Some(toml::Value::String(o)) = &filter.get("outfile") {
        Some(o.clone())
    } else {
        None
    };

    let give_original = matches!(
        &filter.get("give_original"),
        Some(toml::Value::Boolean(true))
    ) && outfile.is_none();

    Ok((Filter::new(command, outfile, give_original), name))
}

pub fn parse_filters(filters: &Vec<toml::Value>) -> ParseResult<HashMap<String, Filter>> {
    let mut new = HashMap::new();
    for i in filters {
        if let toml::Value::Table(v) = i {
            let (filter, name) = parse_filter(v)?;
            new.insert(name.ok_or(ParseError::MissingFilterName)?, filter);
        } else {
            return Err(ParseError::BadArrayItem);
        }
    }

    Ok(new)
}