sloppy_core/
context.rs

1use crate::backend::{Backend, BackendFactory};
2use crate::command::Command;
3use crate::error::{Error, Result};
4use crate::execute::Options;
5use rusty_value::Value;
6use std::boxed::Box;
7use std::collections::HashMap;
8
9#[derive(Default)]
10pub struct Context {
11    globals: HashMap<String, Value>,
12}
13
14impl Context {
15    #[doc = "Execute a command!"]
16    pub fn execute(&mut self, command: &Command, options: &Options) -> Result<()> {
17        let mut backend = BackendFactory::build(&command.backend)?;
18        if !options.args.is_empty() {
19            backend.cmd_args(&options.args)?;
20        }
21        self.import(command, &mut backend)?;
22        backend.execute(&command.program)?;
23        self.export(command, &backend)?;
24        Ok(())
25    }
26
27    #[doc = "Import variables into backend from context!"]
28    fn import(&mut self, command: &Command, backend: &mut Box<dyn Backend>) -> Result<()> {
29        for var_name in command.imports.iter() {
30            let variable = self.globals.get(var_name);
31            match variable {
32                Some(variable) => backend.import(var_name, variable)?,
33                None => return Err(Error::MissingVariable(var_name.to_owned())),
34            }
35        }
36        Ok(())
37    }
38
39    #[doc = "Export variables from backend into context!"]
40    fn export(&mut self, command: &Command, backend: &Box<dyn Backend>) -> Result<()> {
41        for var_name in command.exports.iter() {
42            let variable = backend.export(var_name)?;
43            self.globals.insert(var_name.to_owned(), variable);
44        }
45        Ok(())
46    }
47}