templar/functions/
common.rs1use 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}