diff --git a/crates-cli/yaak-cli/src/plugin_events.rs b/crates-cli/yaak-cli/src/plugin_events.rs index 146c1025..d59bbdd9 100644 --- a/crates-cli/yaak-cli/src/plugin_events.rs +++ b/crates-cli/yaak-cli/src/plugin_events.rs @@ -13,7 +13,7 @@ use tokio::task::JoinHandle; use yaak::plugin_events::{ GroupedPluginEvent, HostRequest, SharedPluginEventContext, handle_shared_plugin_event, }; -use yaak::render::{render_grpc_request, render_http_request}; +use yaak_models::render::{render_grpc_request, render_http_request}; use yaak::response_body::FileResponseBodyStore; use yaak::send::{SendHttpRequestWithPluginsParams, send_http_request_with_plugins}; use yaak_crypto::manager::EncryptionManager; diff --git a/crates-tauri/yaak-app-client/src/render.rs b/crates-tauri/yaak-app-client/src/render.rs index 788b6767..2c995b0d 100644 --- a/crates-tauri/yaak-app-client/src/render.rs +++ b/crates-tauri/yaak-app-client/src/render.rs @@ -4,5 +4,5 @@ //! `yaak-commands` when the template commands did. Callers in this crate do not //! need to track which is which. -pub use yaak::render::{render_grpc_request, render_http_request}; +pub use yaak_models::render::{render_grpc_request, render_http_request}; pub use yaak_commands::render::{render_json_value, render_template}; diff --git a/crates/yaak-models/src/render.rs b/crates/yaak-models/src/render.rs index c509788d..e48d3287 100644 --- a/crates/yaak-models/src/render.rs +++ b/crates/yaak-models/src/render.rs @@ -1,5 +1,11 @@ +//! Rendering requests against an environment chain. +//! +//! Lives here rather than beside the send engine so that the browser's wasm +//! host, which has the model layer but no sockets, renders exactly what the +//! desktop renders. + use crate::models::{ - Environment, EnvironmentVariable, HttpRequest, HttpRequestHeader, HttpUrlParameter, + Environment, EnvironmentVariable, GrpcRequest, HttpRequest, HttpRequestHeader, HttpUrlParameter, }; use crate::path_placeholders::apply_path_placeholders; use log::info; @@ -7,11 +13,7 @@ use serde_json::Value; use std::collections::{BTreeMap, HashMap}; use yaak_templates::{RenderOptions, TemplateCallback, parse_and_render, render_json_value_raw}; -/// Render every template in a request against an environment chain. -/// -/// Lives here rather than beside the send engine so that the browser's wasm -/// host, which has the model layer but no sockets, renders exactly what the -/// desktop renders. +/// Render every template in an HTTP request against an environment chain. pub async fn render_http_request( request: &HttpRequest, environment_chain: Vec, @@ -95,6 +97,64 @@ pub async fn render_http_request( Ok(HttpRequest { url, url_parameters, headers, body, authentication, ..request.to_owned() }) } +pub async fn render_grpc_request( + r: &GrpcRequest, + environment_chain: Vec, + cb: &T, + opt: &RenderOptions, +) -> yaak_templates::error::Result { + let vars = &make_vars_hashmap(environment_chain); + + let mut metadata = Vec::new(); + for p in r.metadata.clone() { + if !p.enabled { + continue; + } + metadata.push(HttpRequestHeader { + enabled: p.enabled, + name: parse_and_render(p.name.as_str(), vars, cb, opt).await?, + value: parse_and_render(p.value.as_str(), vars, cb, opt).await?, + id: p.id, + }) + } + + let authentication = { + let mut disabled = false; + let mut auth = BTreeMap::new(); + match r.authentication.get("disabled") { + Some(Value::Bool(true)) => { + disabled = true; + } + Some(Value::String(tmpl)) => { + disabled = parse_and_render(tmpl.as_str(), vars, cb, opt) + .await + .unwrap_or_default() + .is_empty(); + info!( + "Rendering authentication.disabled as a template: {disabled} from \"{tmpl}\"" + ); + } + _ => {} + } + if disabled { + auth.insert("disabled".to_string(), Value::Bool(true)); + } else { + for (k, v) in r.authentication.clone() { + if k == "disabled" { + auth.insert(k, Value::Bool(false)); + } else { + auth.insert(k, render_json_value_raw(v, vars, cb, opt).await?); + } + } + } + auth + }; + + let url = parse_and_render(r.url.as_str(), vars, cb, opt).await?; + + Ok(GrpcRequest { url, metadata, authentication, ..r.to_owned() }) +} + pub fn make_vars_hashmap(environment_chain: Vec) -> HashMap { let mut variables = HashMap::new(); diff --git a/crates/yaak/src/lib.rs b/crates/yaak/src/lib.rs index e21be7e3..56eaabe8 100644 --- a/crates/yaak/src/lib.rs +++ b/crates/yaak/src/lib.rs @@ -2,7 +2,6 @@ pub mod error; pub mod export; pub mod import; pub mod plugin_events; -pub mod render; pub mod response_body; pub mod send; diff --git a/crates/yaak/src/render.rs b/crates/yaak/src/render.rs deleted file mode 100644 index 5cecf215..00000000 --- a/crates/yaak/src/render.rs +++ /dev/null @@ -1,66 +0,0 @@ -use log::info; -use serde_json::Value; -use std::collections::BTreeMap; -use yaak_models::models::{Environment, GrpcRequest, HttpRequestHeader}; -use yaak_models::render::make_vars_hashmap; -use yaak_templates::{RenderOptions, TemplateCallback, parse_and_render, render_json_value_raw}; - -pub use yaak_models::render::render_http_request; - -pub async fn render_grpc_request( - r: &GrpcRequest, - environment_chain: Vec, - cb: &T, - opt: &RenderOptions, -) -> yaak_templates::error::Result { - let vars = &make_vars_hashmap(environment_chain); - - let mut metadata = Vec::new(); - for p in r.metadata.clone() { - if !p.enabled { - continue; - } - metadata.push(HttpRequestHeader { - enabled: p.enabled, - name: parse_and_render(p.name.as_str(), vars, cb, opt).await?, - value: parse_and_render(p.value.as_str(), vars, cb, opt).await?, - id: p.id, - }) - } - - let authentication = { - let mut disabled = false; - let mut auth = BTreeMap::new(); - match r.authentication.get("disabled") { - Some(Value::Bool(true)) => { - disabled = true; - } - Some(Value::String(tmpl)) => { - disabled = parse_and_render(tmpl.as_str(), vars, cb, opt) - .await - .unwrap_or_default() - .is_empty(); - info!( - "Rendering authentication.disabled as a template: {disabled} from \"{tmpl}\"" - ); - } - _ => {} - } - if disabled { - auth.insert("disabled".to_string(), Value::Bool(true)); - } else { - for (k, v) in r.authentication.clone() { - if k == "disabled" { - auth.insert(k, Value::Bool(false)); - } else { - auth.insert(k, render_json_value_raw(v, vars, cb, opt).await?); - } - } - } - auth - }; - - let url = parse_and_render(r.url.as_str(), vars, cb, opt).await?; - - Ok(GrpcRequest { url, metadata, authentication, ..r.to_owned() }) -} diff --git a/crates/yaak/src/send.rs b/crates/yaak/src/send.rs index e48e0606..0b906085 100644 --- a/crates/yaak/src/send.rs +++ b/crates/yaak/src/send.rs @@ -1,4 +1,3 @@ -use crate::render::render_http_request; use async_trait::async_trait; use log::warn; use std::path::{Path, PathBuf}; @@ -29,6 +28,7 @@ use yaak_models::models::{ ResolvedHttpRequestSettings, ResolvedSetting, }; use yaak_models::query_manager::QueryManager; +use yaak_models::render::render_http_request; use yaak_models::util::{UpdateSource, generate_prefixed_id}; use yaak_plugins::events::{ CallHttpAuthenticationRequest, HttpHeader, PluginContext, RenderPurpose,