Beginning of applying filters for json types. Currently only supports html escaping.
This commit is contained in:
parent
34c8d24a69
commit
6a9fe9e1be
@ -10,5 +10,6 @@
|
||||
],
|
||||
"object": {
|
||||
"foo": "bar"
|
||||
}
|
||||
},
|
||||
"special_characters": "<>&\"'"
|
||||
}
|
||||
|
@ -1,6 +1,15 @@
|
||||
Object parsed: {string|jp}{~n}
|
||||
Object parsed and stringified: {string|jp|js}{~n}
|
||||
Object stringified and parsed: {string|js|jp}{~n}
|
||||
Special characters: {special_characters}{~n}
|
||||
|
||||
Object string parsed: {string|jp}{~n}
|
||||
Object string parsed and stringified: {string|jp|js}{~n}
|
||||
Object string stringified and parsed: {string|js|jp}{~n}
|
||||
|
||||
Array: {array}{~n}
|
||||
Array stringified: {array|js}{~n}
|
||||
Array stringified and parsed: {array|js|jp}{~n}
|
||||
|
||||
Object: {object}{~n}
|
||||
Object html escaped: {object|h}{~n}
|
||||
Object html escaping disabled: {object|s}{~n}
|
||||
Object stringified: {object|js}{~n}
|
||||
Object stringified and parsed: {object|js|jp}{~n}
|
||||
|
56
src/bin.rs
56
src/bin.rs
@ -73,11 +73,60 @@ fn read_context_from_stdin() -> serde_json::Value {
|
||||
serde_json::from_str(&buffer).expect("Failed to parse json")
|
||||
}
|
||||
|
||||
fn html_escape(inp: &str) -> String {
|
||||
// Adding 10% space from the original to avoid re-allocations by
|
||||
// leaving room for escaped sequences.
|
||||
let mut output = String::with_capacity(((inp.len() as f64) * 1.1) as usize);
|
||||
inp.chars().for_each(|c| match c {
|
||||
'<' => output.push_str("<"),
|
||||
'>' => output.push_str(">"),
|
||||
'"' => output.push_str("""),
|
||||
'\'' => output.push_str("'"),
|
||||
'&' => output.push_str("&"),
|
||||
_ => output.push(c),
|
||||
});
|
||||
output
|
||||
}
|
||||
|
||||
fn apply_filter(
|
||||
json_value: &serde_json::Value,
|
||||
filter: &Filter,
|
||||
) -> Result<serde_json::Value, RenderError> {
|
||||
match (json_value, filter) {
|
||||
(serde_json::Value::String(string), Filter::HtmlEncode) => {
|
||||
Ok(serde_json::Value::String(html_escape(string)))
|
||||
}
|
||||
(_, Filter::HtmlEncode) => Ok(serde_json::Value::String(html_escape(
|
||||
&json_value.render(&Vec::new())?,
|
||||
))),
|
||||
_ => panic!("Unimplemented"),
|
||||
}
|
||||
}
|
||||
|
||||
fn apply_filters(
|
||||
json_value: &serde_json::Value,
|
||||
filters: &[Filter],
|
||||
) -> Result<serde_json::Value, RenderError> {
|
||||
let mut final_value: serde_json::Value = apply_filter(json_value, &filters[0])?;
|
||||
|
||||
for filter in &filters[1..] {
|
||||
final_value = apply_filter(&final_value, filter)?;
|
||||
}
|
||||
|
||||
Ok(final_value)
|
||||
}
|
||||
|
||||
impl ContextElement for serde_json::Value {}
|
||||
|
||||
impl Renderable for serde_json::Value {
|
||||
fn render(&self, _filters: &Vec<Filter>) -> Result<String, RenderError> {
|
||||
match self {
|
||||
let after_apply = if _filters.is_empty() {
|
||||
Some(apply_filters(self, _filters)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
match after_apply.as_ref().unwrap_or(self) {
|
||||
serde_json::Value::Null => Ok("".to_owned()),
|
||||
serde_json::Value::Bool(boolean) => Ok(boolean.to_string()),
|
||||
serde_json::Value::Number(num) => Ok(num.to_string()),
|
||||
@ -395,4 +444,9 @@ mod tests {
|
||||
Ok::<_, RenderError>("3,5,7,9".to_owned())
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_html_escape() {
|
||||
assert_eq!(html_escape("<>&\"'"), "<>&"'".to_owned())
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user