Skip to content

Commit

Permalink
Merge pull request #409 from sunng87/feature/partial-block-api
Browse files Browse the repository at this point in the history
Feature/partial block api
  • Loading branch information
sunng87 committed Jan 3, 2021
2 parents 5d3df64 + 3ab6b8c commit 1ff44f0
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 25 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Expand Up @@ -31,7 +31,7 @@ walkdir = { version = "2.2.3", optional = true }
rhai = { version = "0.19.6", optional = true, features = ["sync", "serde"] }

[dev-dependencies]
env_logger = "0.7.1"
env_logger = "0.8"
maplit = "1.0.0"
serde_derive = "1.0.75"
tempfile = "3.0.0"
Expand Down
1 change: 0 additions & 1 deletion src/block.rs
Expand Up @@ -61,7 +61,6 @@ pub struct BlockContext<'reg> {
base_path: Vec<String>,
/// the base_value of current block scope, when the block is using a
/// constant or derived value as block base
/// FIXME: we use owned json temporarily to avoid lifetime issue
base_value: Option<Json>,
/// current block context variables
block_params: BlockParams<'reg>,
Expand Down
6 changes: 3 additions & 3 deletions src/context.rs
Expand Up @@ -137,14 +137,14 @@ fn get_in_block_params<'a, 'reg>(
None
}

pub(crate) fn merge_json(base: &Json, addition: &HashMap<&&str, &Json>) -> Json {
pub(crate) fn merge_json(base: &Json, addition: &HashMap<&str, &Json>) -> Json {
let mut base_map = match base {
Json::Object(ref m) => m.clone(),
_ => Map::new(),
};

for (k, v) in addition.iter() {
base_map.insert((*(*k)).to_string(), (*v).clone());
base_map.insert(k.to_string(), (*v).clone());
}

Json::Object(base_map)
Expand Down Expand Up @@ -333,7 +333,7 @@ mod test {
let s = "hello".to_owned();
let mut hash = HashMap::new();
let v = value::to_json("h1");
hash.insert(&"tag", &v);
hash.insert("tag", &v);

let ctx_a1 = Context::wraps(&context::merge_json(&map, &hash)).unwrap();
assert_eq!(
Expand Down
53 changes: 33 additions & 20 deletions src/partial.rs
Expand Up @@ -2,6 +2,7 @@ use std::collections::HashMap;

use serde_json::value::Value as Json;

use crate::block::BlockContext;
use crate::context::{merge_json, Context};
use crate::error::RenderError;
use crate::json::path::Path;
Expand Down Expand Up @@ -35,40 +36,52 @@ pub fn expand_partial<'reg: 'rc, 'rc>(
.or_else(|| d.template());

if let Some(t) = partial {
// clone to avoid lifetime issue
// FIXME refactor this to avoid
let mut local_rc = rc.clone();
let is_partial_block = tname == PARTIAL_BLOCK;

if is_partial_block {
local_rc.inc_partial_block_depth();
}

// partial context path
if let Some(ref param_ctx) = d.param(0) {
if let (Some(p), Some(block)) = (param_ctx.context_path(), local_rc.block_mut()) {
*block.base_path_mut() = p.clone();
}
let mut block_created = false;

if let Some(ref base_path) = d.param(0).and_then(|p| p.context_path()) {
// path given, update base_path
let mut block = BlockContext::new();
*block.base_path_mut() = base_path.to_vec();
block_created = true;
local_rc.push_block(block);
} else if !d.hash().is_empty() {
let mut block = BlockContext::new();
// hash given, update base_value
let hash_ctx = d
.hash()
.iter()
.map(|(k, v)| (*k, v.value()))
.collect::<HashMap<&str, &Json>>();

let merged_context = merge_json(
local_rc.evaluate2(ctx, &Path::current())?.as_json(),
&hash_ctx,
);
block.set_base_value(merged_context);
block_created = true;
local_rc.push_block(block);
}

// @partial-block
if let Some(pb) = d.template() {
local_rc.push_partial_block(pb);
}

let result = if d.hash().is_empty() {
t.render(r, ctx, &mut local_rc, out)
} else {
let hash_ctx = d
.hash()
.iter()
.map(|(k, v)| (k, v.value()))
.collect::<HashMap<&&str, &Json>>();
let current_path = Path::current();
let partial_context =
merge_json(local_rc.evaluate2(ctx, &current_path)?.as_json(), &hash_ctx);
let ctx = Context::wraps(&partial_context)?;
let mut partial_rc = local_rc.new_for_block();
t.render(r, &ctx, &mut partial_rc, out)
};
let result = t.render(r, ctx, &mut local_rc, out);

// cleanup
if block_created {
local_rc.pop_block();
}

if is_partial_block {
local_rc.dec_partial_block_depth();
Expand Down

0 comments on commit 1ff44f0

Please sign in to comment.