diff --git a/js/test_cases/helpers_size/README.md b/js/test_cases/helpers_size/README.md new file mode 100644 index 0000000..d39036d --- /dev/null +++ b/js/test_cases/helpers_size/README.md @@ -0,0 +1,9 @@ +Excerpt from [the DustJS tutorial](https://github.com/linkedin/dustjs/wiki/Dust-Tutorial#size_keyxxx___size_helper_Available_in_Dust_V11_release): + + Array - number of elements, [1,2,3,4] has size=4 + String - length of the string, "abcdef" has size=6 + Object - Number of properties in the object, {a:4, b:8, c:15, d:16} has size=4 + Number - Value of the number, 23 has size 23 and 3.14 has size 3.14 + Undefined, 0, empty string - zero + Any other value - length after conversion to string + diff --git a/js/test_cases/helpers_size/inputarray.json b/js/test_cases/helpers_size/inputarray.json new file mode 100644 index 0000000..98f6406 --- /dev/null +++ b/js/test_cases/helpers_size/inputarray.json @@ -0,0 +1,7 @@ +{ + "val": [ + "Alice", + "Bob", + "Chris" + ] +} diff --git a/js/test_cases/helpers_size/inputemptystring.json b/js/test_cases/helpers_size/inputemptystring.json new file mode 100644 index 0000000..f911fb5 --- /dev/null +++ b/js/test_cases/helpers_size/inputemptystring.json @@ -0,0 +1,3 @@ +{ + "val": "" +} diff --git a/js/test_cases/helpers_size/inputfalse.json b/js/test_cases/helpers_size/inputfalse.json new file mode 100644 index 0000000..9cc7fda --- /dev/null +++ b/js/test_cases/helpers_size/inputfalse.json @@ -0,0 +1,3 @@ +{ + "val": false +} diff --git a/js/test_cases/helpers_size/inputmissing.json b/js/test_cases/helpers_size/inputmissing.json new file mode 100644 index 0000000..95cf907 --- /dev/null +++ b/js/test_cases/helpers_size/inputmissing.json @@ -0,0 +1,3 @@ +{ + "notval": "Alice" +} diff --git a/js/test_cases/helpers_size/inputnumber.json b/js/test_cases/helpers_size/inputnumber.json new file mode 100644 index 0000000..378b4a9 --- /dev/null +++ b/js/test_cases/helpers_size/inputnumber.json @@ -0,0 +1,3 @@ +{ + "val": 7.21 +} diff --git a/js/test_cases/helpers_size/inputobject.json b/js/test_cases/helpers_size/inputobject.json new file mode 100644 index 0000000..4ead7ce --- /dev/null +++ b/js/test_cases/helpers_size/inputobject.json @@ -0,0 +1,6 @@ +{ + "val": { + "pet": "cat", + "name": "fluffy" + } +} diff --git a/js/test_cases/helpers_size/inputstring.json b/js/test_cases/helpers_size/inputstring.json new file mode 100644 index 0000000..e462e67 --- /dev/null +++ b/js/test_cases/helpers_size/inputstring.json @@ -0,0 +1,3 @@ +{ + "val": "Alice" +} diff --git a/js/test_cases/helpers_size/inputtrue.json b/js/test_cases/helpers_size/inputtrue.json new file mode 100644 index 0000000..25d6b1f --- /dev/null +++ b/js/test_cases/helpers_size/inputtrue.json @@ -0,0 +1,3 @@ +{ + "val": true +} diff --git a/js/test_cases/helpers_size/inputzero.json b/js/test_cases/helpers_size/inputzero.json new file mode 100644 index 0000000..d6110e8 --- /dev/null +++ b/js/test_cases/helpers_size/inputzero.json @@ -0,0 +1,3 @@ +{ + "val": 0 +} diff --git a/js/test_cases/helpers_size/main.dust b/js/test_cases/helpers_size/main.dust new file mode 100644 index 0000000..fab1f99 --- /dev/null +++ b/js/test_cases/helpers_size/main.dust @@ -0,0 +1,3 @@ +The size of val ({val|js|s}) is {@size key=val /}{~n} +The size of "{val}" is {@size key="{val}" /}{~n} +The size with no key is {@size /}{~n} diff --git a/src/bin.rs b/src/bin.rs index 3c4c8c2..0f279c7 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -15,6 +15,7 @@ use renderer::Loopable; use renderer::MathNumber; use renderer::RenderError; use renderer::Renderable; +use renderer::Sizable; use renderer::Truthiness; use renderer::WalkError; use renderer::Walkable; @@ -313,6 +314,12 @@ impl Loopable for serde_json::Value { } } +impl Sizable for serde_json::Value { + fn get_size<'a>(&'a self) -> Option> { + todo!() + } +} + impl Castable for serde_json::Value { fn cast_to_type<'a>(&'a self, target: &str) -> Option> { match (self, target) { diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 56d194c..01281d3 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -22,6 +22,7 @@ pub trait ContextElement: + FromContextElement + IntoRcIce + Castable + + Sizable { } @@ -63,6 +64,10 @@ pub trait Castable { fn cast_to_type<'a>(&'a self, target: &str) -> Option>; } +pub trait Sizable { + fn get_size<'a>(&'a self) -> Option>; +} + pub trait CastToAny { fn to_any(&self) -> &dyn Any; } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 571a02b..9b1f5b7 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -18,6 +18,7 @@ pub use context_element::IceResult; pub use context_element::IntoContextElement; pub use context_element::Loopable; pub use context_element::Renderable; +pub use context_element::Sizable; pub use context_element::Truthiness; pub use context_element::Walkable; pub use errors::CompileError; diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index a886586..0d45fbc 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -14,6 +14,7 @@ use crate::renderer::DustRenderer; use crate::renderer::Loopable; use crate::renderer::RenderError; use crate::renderer::Renderable; +use crate::renderer::Sizable; use crate::renderer::Truthiness; use crate::renderer::WalkError; use crate::renderer::Walkable; @@ -189,6 +190,12 @@ impl Walkable for OwnedLiteral { } } +impl Sizable for OwnedLiteral { + fn get_size<'a>(&'a self) -> Option> { + todo!() + } +} + impl Castable for OwnedLiteral { fn cast_to_type<'a>(&'a self, target: &str) -> Option> { match (self, target) {