diff options
Diffstat (limited to 'src/executor.rs')
-rw-r--r-- | src/executor.rs | 58 |
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(()) } } |