diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp index 124507e..a877bf9 100644 --- a/include/inja/renderer.hpp +++ b/include/inja/renderer.hpp @@ -180,11 +180,11 @@ class Renderer { } case Bytecode::Op::PrintValue: { const json& val = *get_args(bc)[0]; - if (val.is_string()) + if (val.is_string()) { os << val.get_ref(); - else + } else { os << val.dump(); - // val.dump(os); + } pop_args(bc); break; } @@ -215,7 +215,15 @@ class Renderer { break; } case Bytecode::Op::Length: { - auto result = get_args(bc)[0]->size(); + const json& val = *get_args(bc)[0]; + + int result; + if (val.is_string()) { + result = val.get_ref().length(); + } else { + result = val.size(); + } + pop_args(bc); m_stack.emplace_back(result); break; diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp index 30cc2c0..4c46787 100644 --- a/single_include/inja/inja.hpp +++ b/single_include/inja/inja.hpp @@ -2786,11 +2786,11 @@ class Renderer { } case Bytecode::Op::PrintValue: { const json& val = *get_args(bc)[0]; - if (val.is_string()) + if (val.is_string()) { os << val.get_ref(); - else + } else { os << val.dump(); - // val.dump(os); + } pop_args(bc); break; } @@ -2821,7 +2821,15 @@ class Renderer { break; } case Bytecode::Op::Length: { - auto result = get_args(bc)[0]->size(); + const json& val = *get_args(bc)[0]; + + int result; + if (val.is_string()) { + result = val.get_ref().length(); + } else { + result = val.size(); + } + pop_args(bc); m_stack.emplace_back(result); break; diff --git a/test/unit-renderer.cpp b/test/unit-renderer.cpp index b352765..bcd56dd 100644 --- a/test/unit-renderer.cpp +++ b/test/unit-renderer.cpp @@ -73,7 +73,7 @@ TEST_CASE("types") { SECTION("nested loops") { auto ldata = json::parse( R"DELIM( -{ "outer" : [ +{ "outer" : [ { "inner" : [ { "in2" : [ 1, 2 ] }, { "in2" : []}, @@ -170,7 +170,9 @@ TEST_CASE("functions") { } SECTION("length") { - CHECK( env.render("{{ length(names) }}", data) == "4" ); + CHECK( env.render("{{ length(names) }}", data) == "4" ); // Length of array + CHECK( env.render("{{ length(name) }}", data) == "5" ); // Length of string + // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" ); }