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}