mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-23 09:18:30 +02:00
Lazily render variables (#108)
This commit is contained in:
@@ -15,7 +15,7 @@ pub async fn render_template<R: Runtime>(
|
|||||||
e: Option<&Environment>,
|
e: Option<&Environment>,
|
||||||
) -> String {
|
) -> String {
|
||||||
let cb = &*app_handle.state::<PluginTemplateCallback>();
|
let cb = &*app_handle.state::<PluginTemplateCallback>();
|
||||||
let vars = &variables_from_environment(w, e, cb).await;
|
let vars = &make_vars_hashmap(w, e);
|
||||||
render(template, vars, cb).await
|
render(template, vars, cb).await
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ pub async fn render_grpc_request<R: Runtime>(
|
|||||||
e: Option<&Environment>,
|
e: Option<&Environment>,
|
||||||
) -> GrpcRequest {
|
) -> GrpcRequest {
|
||||||
let cb = &*app_handle.state::<PluginTemplateCallback>();
|
let cb = &*app_handle.state::<PluginTemplateCallback>();
|
||||||
let vars = &variables_from_environment(w, e, cb).await;
|
let vars = &make_vars_hashmap(w, e);
|
||||||
|
|
||||||
let mut metadata = Vec::new();
|
let mut metadata = Vec::new();
|
||||||
for p in r.metadata.clone() {
|
for p in r.metadata.clone() {
|
||||||
@@ -58,7 +58,7 @@ pub async fn render_http_request(
|
|||||||
e: Option<&Environment>,
|
e: Option<&Environment>,
|
||||||
cb: &PluginTemplateCallback,
|
cb: &PluginTemplateCallback,
|
||||||
) -> HttpRequest {
|
) -> HttpRequest {
|
||||||
let vars = &variables_from_environment(w, e, cb).await;
|
let vars = &make_vars_hashmap(w, e);
|
||||||
|
|
||||||
let mut url_parameters = Vec::new();
|
let mut url_parameters = Vec::new();
|
||||||
for p in r.url_parameters.clone() {
|
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>(
|
pub fn make_vars_hashmap(
|
||||||
m: &HashMap<String, String>,
|
|
||||||
render_count: usize,
|
|
||||||
cb: &T,
|
|
||||||
) -> HashMap<String, String> {
|
|
||||||
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<T: TemplateCallback>(
|
|
||||||
workspace: &Workspace,
|
workspace: &Workspace,
|
||||||
environment: Option<&Environment>,
|
environment: Option<&Environment>,
|
||||||
cb: &T,
|
|
||||||
) -> HashMap<String, String> {
|
) -> HashMap<String, String> {
|
||||||
let mut variables = HashMap::new();
|
let mut variables = HashMap::new();
|
||||||
variables = add_variable_to_map(variables, &workspace.variables);
|
variables = add_variable_to_map(variables, &workspace.variables);
|
||||||
@@ -133,7 +110,7 @@ pub async fn variables_from_environment<T: TemplateCallback>(
|
|||||||
variables = add_variable_to_map(variables, &e.variables);
|
variables = add_variable_to_map(variables, &e.variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
recursively_render_variables(&variables, 0, cb).await
|
variables
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn render<T: TemplateCallback>(
|
pub async fn render<T: TemplateCallback>(
|
||||||
|
|||||||
@@ -47,7 +47,10 @@ async fn render_tag<T: TemplateCallback>(
|
|||||||
match val {
|
match val {
|
||||||
Val::Str { text } => text.into(),
|
Val::Str { text } => text.into(),
|
||||||
Val::Var { name } => match vars.get(name.as_str()) {
|
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(),
|
None => "".into(),
|
||||||
},
|
},
|
||||||
Val::Bool { value } => value.to_string(),
|
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]
|
#[tokio::test]
|
||||||
async fn render_surrounded() {
|
async fn render_surrounded() {
|
||||||
let empty_cb = EmptyCB {};
|
let empty_cb = EmptyCB {};
|
||||||
|
|||||||
Reference in New Issue
Block a user