seru 0.1.0

simple image renderer
Documentation
use std::collections::HashMap;

use anyhow::Context;

use crate::core::Value;

pub struct Args {
    inner: HashMap<String, Value>,
}

impl Args {
    pub fn new(inner: HashMap<String, Value>) -> Self {
        Self { inner }
    }

    pub fn take(&mut self, name: &str) -> Option<Value> {
        self.inner.remove(name)
    }

    pub fn take_required(&mut self, name: &str) -> anyhow::Result<Value> {
        self.take(name)
            .with_context(|| format!("missing required argument: {}", name))
    }

    pub fn take_string(&mut self, name: &str) -> anyhow::Result<Option<String>> {
        self.take(name).map(|v| v.into_string()).transpose()
    }

    pub fn take_required_string(&mut self, name: &str) -> anyhow::Result<String> {
        self.take_required(name)?.into_string()
    }

    pub fn take_number(&mut self, name: &str) -> anyhow::Result<Option<f32>> {
        self.take(name).map(|v| v.into_number()).transpose()
    }

    pub fn finish(self) -> anyhow::Result<()> {
        if let Some(name) = self.inner.keys().next() {
            anyhow::bail!("unknown argument: {}", name);
        }

        Ok(())
    }
}