From 296221a22e72ddb8cf2ac6949057362ddbd01cf8 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Tue, 24 Sep 2024 10:18:56 -0700 Subject: [PATCH] Lazily render variables (#108) --- src-tauri/src/render.rs | 33 ++++-------------------- src-tauri/yaak_templates/src/renderer.rs | 21 ++++++++++++++- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src-tauri/src/render.rs b/src-tauri/src/render.rs index 1df31143..ae002599 100644 --- a/src-tauri/src/render.rs +++ b/src-tauri/src/render.rs @@ -15,7 +15,7 @@ pub async fn render_template( e: Option<&Environment>, ) -> String { let cb = &*app_handle.state::(); - let vars = &variables_from_environment(w, e, cb).await; + let vars = &make_vars_hashmap(w, e); render(template, vars, cb).await } @@ -26,7 +26,7 @@ pub async fn render_grpc_request( e: Option<&Environment>, ) -> GrpcRequest { let cb = &*app_handle.state::(); - let vars = &variables_from_environment(w, e, cb).await; + let vars = &make_vars_hashmap(w, e); let mut metadata = Vec::new(); for p in r.metadata.clone() { @@ -58,7 +58,7 @@ pub async fn render_http_request( e: Option<&Environment>, cb: &PluginTemplateCallback, ) -> HttpRequest { - let vars = &variables_from_environment(w, e, cb).await; + let vars = &make_vars_hashmap(w, e); let mut url_parameters = Vec::new(); for p in r.url_parameters.clone() { @@ -99,32 +99,9 @@ pub async fn render_http_request( } } -pub async fn recursively_render_variables<'s, T: TemplateCallback>( - m: &HashMap, - render_count: usize, - cb: &T, -) -> HashMap { - let mut did_render = false; - let mut new_map = m.clone(); - for (k, v) in m.clone() { - let rendered = Box::pin(render(v.as_str(), m, cb)).await; - if rendered != v { - did_render = true - } - new_map.insert(k, rendered); - } - - if did_render && render_count <= 3 { - new_map = Box::pin(recursively_render_variables(&new_map, render_count + 1, cb)).await; - } - - new_map -} - -pub async fn variables_from_environment( +pub fn make_vars_hashmap( workspace: &Workspace, environment: Option<&Environment>, - cb: &T, ) -> HashMap { let mut variables = HashMap::new(); variables = add_variable_to_map(variables, &workspace.variables); @@ -133,7 +110,7 @@ pub async fn variables_from_environment( variables = add_variable_to_map(variables, &e.variables); } - recursively_render_variables(&variables, 0, cb).await + variables } pub async fn render( diff --git a/src-tauri/yaak_templates/src/renderer.rs b/src-tauri/yaak_templates/src/renderer.rs index a8462a80..8b4679c2 100644 --- a/src-tauri/yaak_templates/src/renderer.rs +++ b/src-tauri/yaak_templates/src/renderer.rs @@ -47,7 +47,10 @@ async fn render_tag( match val { Val::Str { text } => text.into(), Val::Var { name } => match vars.get(name.as_str()) { - Some(v) => v.to_string(), + Some(v) => { + let r = Box::pin(parse_and_render(v, vars, cb)).await; + r.to_string() + }, None => "".into(), }, Val::Bool { value } => value.to_string(), @@ -143,6 +146,22 @@ mod tests { ); } + #[tokio::test] + async fn render_recursive_var() { + let empty_cb = EmptyCB {}; + let template = "${[ foo ]}"; + let mut vars = HashMap::new(); + vars.insert("foo".to_string(), "foo: ${[ bar ]}".to_string()); + vars.insert("bar".to_string(), "bar: ${[ baz ]}".to_string()); + vars.insert("baz".to_string(), "baz".to_string()); + + let result = "foo: bar: baz"; + assert_eq!( + parse_and_render(template, &vars, &empty_cb).await, + result.to_string() + ); + } + #[tokio::test] async fn render_surrounded() { let empty_cb = EmptyCB {};