aboutsummaryrefslogtreecommitdiff
path: root/src/executor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/executor.rs')
-rw-r--r--src/executor.rs58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/executor.rs b/src/executor.rs
index f6ca4f5..03477e3 100644
--- a/src/executor.rs
+++ b/src/executor.rs
@@ -1,10 +1,15 @@
-use crate::barbfile::BarbFile;
+use crate::barbfile::{BarbFile, BarbFilter};
use crate::output::BarbOutput;
+use jq_rs;
+
use std::collections::HashMap;
use ureq;
use ureq::Error as UreqError;
+use std::fs;
+use std::str::FromStr;
+
pub struct Context {
vars: HashMap<String, String>,
}
@@ -49,6 +54,26 @@ impl Context {
}
}
+
+fn apply_filter(filter: &BarbFilter, body: &String) -> Result<String, String> {
+ jq_rs::run(filter.filter().as_str(), body.as_str()).map_err(|x| x.to_string())
+}
+
+fn apply_filters(bfile: &BarbFile, body: String, arg_filter: &Option<String>) -> Result<String, String> {
+ if let Some(filter) = arg_filter {
+ return Ok(apply_filter(&BarbFilter::new(None, filter.to_string()), &body)?);
+ } else if bfile.filters().len() > 0 {
+ return Ok(bfile
+ .filters()
+ .iter()
+ .map(|filter| apply_filter(filter, &body))
+ .last()
+ .unwrap().unwrap());
+ }
+ Ok(String::from(body))
+}
+
+
pub struct Executor {
context: Context,
}
@@ -97,10 +122,35 @@ impl Executor {
pub fn execute(
&mut self,
- bfile: &BarbFile,
+ file_name: &String,
output: &BarbOutput,
- ) -> Result<ureq::Response, String> {
- self.run(bfile, self.make_req(&bfile, output))
+ filter: &Option<String>
+ ) -> Result<(), String> {
+ let bfile = BarbFile::from_str(
+ fs::read_to_string(file_name.as_str())
+ .map_err(|_| format!("Failed to read file '{}'", file_name))?
+ .as_str(),
+ )
+ .map_err(|_| format!("Failed to parse file '{}'", file_name))?;
+ let response = self.run(&bfile, self.make_req(&bfile, output))?;
+ //let response = executor.execute(&bfile, &output)?;
+
+ output.status(response.status(), response.status_text());
+ for header_name in response.headers_names() {
+ output.resp_hdr(
+ header_name.to_string(),
+ response.header(header_name.as_str()).unwrap(),
+ );
+ }
+ output.end_resp_hdr();
+
+ output.body(apply_filters(
+ &bfile,
+ response.into_string().unwrap(),
+ filter
+ )?);
+
+ Ok(())
}
}