Skip to main content

templar/functions/
common.rs

1use crate::*;
2use std::collections::BTreeMap;
3use std::fs::File;
4use std::io::Read;
5use std::path::PathBuf;
6use std::process::Command;
7use std::str;
8
9#[cfg(feature = "json-extension")]
10#[templar_function]
11pub fn json(content: String) -> Result<InnerData> {
12    serde_json::from_str(&content).wrap()
13}
14
15#[cfg(feature = "yaml-extension")]
16#[templar_function]
17pub fn yaml(content: String) -> Result<InnerData> {
18    serde_yaml::from_str(&content).wrap()
19}
20
21#[templar_function]
22pub fn file(path: String) -> Result<String> {
23    let path: PathBuf = PathBuf::from(path);
24    let mut file = File::open(path)?;
25    let mut result = String::new();
26    file.read_to_string(&mut result)?;
27    Ok(result)
28}
29
30#[templar_function]
31pub fn env(env_var: String) -> Result<String> {
32    std::env::var(env_var).wrap()
33}
34
35pub fn script(args: Data) -> Data {
36    let mut sh_args = vec![InnerData::String("sh".into()), "-c".into()];
37    match args.into_result().map(|i| i.into_inner()) {
38        Ok(InnerData::Seq(s)) => {
39            for arg in s.iter() {
40                sh_args.push(arg.clone())
41            }
42        }
43        Err(e) => return e.into(),
44        Ok(other) => sh_args.push(other),
45    }
46    command(sh_args.into())
47}
48
49pub fn command(args: Data) -> Data {
50    let mut sh_args = vec![];
51    match args.into_result().map(|i| i.into_inner()) {
52        Ok(InnerData::Seq(s)) => {
53            for arg in s.iter() {
54                sh_args.push(arg.to_string())
55            }
56        }
57        Err(e) => return e.into(),
58        Ok(other) => sh_args.push(other.to_string()),
59    }
60    let result = Command::new("/usr/bin/env").args(sh_args).output();
61    match result {
62        Ok(result) => {
63            let mut map = BTreeMap::<InnerData, InnerData>::new();
64            map.insert(
65                "stdout".into(),
66                str::from_utf8(&result.stdout).unwrap_or_default().into(),
67            );
68            map.insert(
69                "stderr".into(),
70                str::from_utf8(&result.stderr).unwrap_or_default().into(),
71            );
72            map.insert(
73                "status".into(),
74                result.status.code().unwrap_or_default().into(),
75            );
76            InnerData::from(map).into()
77        }
78        Err(e) => TemplarError::from(e).into(),
79    }
80}