From c2283f70d49dcf26efb7141327126b5cc872c7a7 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Sun, 27 Jun 2021 22:42:00 +0200 Subject: [PATCH] Generator when printing Model/Space is recognizing now such parameters: - "dump" or "dump_to_space" parameters to make a dump in Space format - "dump_to_json" parameter to make json dump - "pretty" parameter to make the dump pretty (with new lines and indents) --- src/generator.h | 101 +++++++++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/generator.h b/src/generator.h index 93a98a3..fc5b61a 100644 --- a/src/generator.h +++ b/src/generator.h @@ -378,10 +378,14 @@ private: void TrimWhite(const wchar_t *& start, const wchar_t *& end); void SkipWhite(const wchar_t *& str); size_t StrToSize(const wchar_t * str, const wchar_t ** str_end = 0); - bool ShouldEscapeValue(std::vector & parameters); - bool ShouldMakeDump(std::vector & parameters); + + bool HasParam(std::vector & parameters, const wchar_t * param1, const wchar_t * param2 = nullptr); + bool ShouldMakeSpaceDump(std::vector & parameters); + bool ShouldMakeJsonDump(std::vector & parameters); + bool IsPrettyPrint(std::vector & parameters); bool IsCurrentParam(std::vector & parameters); + void DumpSpaceIfNeeded(std::vector & parameters, StreamType & out_stream, pt::Space * space); void CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream); @@ -1203,33 +1207,14 @@ void Generator::CallObject(BaseObj & base_obj, int metho - template -bool Generator::ShouldEscapeValue(std::vector & parameters) +bool Generator::HasParam(std::vector & parameters, const wchar_t * param1, const wchar_t * param2) { for(Var & var : parameters) { if( !var.is_function ) { - if( var.str == L"raw" || var.str == L"noescape" ) - { - return false; - } - } - } - - return true; -} - - -template -bool Generator::ShouldMakeDump(std::vector & parameters) -{ - for(Var & var : parameters) - { - if( !var.is_function ) - { - if( var.str == L"dump" || var.str == L"to_str" ) + if( var.str == param1 || (param2 && var.str == param2) ) { return true; } @@ -1240,21 +1225,56 @@ bool Generator::ShouldMakeDump(std::vector & parameters) } + +template +bool Generator::ShouldMakeSpaceDump(std::vector & parameters) +{ + return HasParam(parameters, L"dump", L"dump_to_space"); +} + + +template +bool Generator::ShouldMakeJsonDump(std::vector & parameters) +{ + return HasParam(parameters, L"dump_to_json"); +} + + template bool Generator::IsCurrentParam(std::vector & parameters) { - for(Var & var : parameters) + return HasParam(parameters, L"current"); +} + + +template +bool Generator::IsPrettyPrint(std::vector & parameters) +{ + return HasParam(parameters, L"pretty"); +} + + + +template +void Generator::DumpSpaceIfNeeded(std::vector & parameters, StreamType & out_stream, pt::Space * space) +{ + bool dump_space = ShouldMakeSpaceDump(parameters); + bool dump_json = ShouldMakeJsonDump(parameters); + + if( dump_space || dump_json ) { - if( !var.is_function ) + bool pretty = IsPrettyPrint(parameters); + + if( dump_space ) { - if( var.str == L"current" ) - { - return true; - } + space->serialize_to_space_stream(out_stream, pretty); + } + else + if( dump_json ) + { + space->serialize_to_json_stream(out_stream, pretty); } } - - return false; } @@ -1262,12 +1282,8 @@ bool Generator::IsCurrentParam(std::vector & parameters) template void Generator::CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space) { - // should we convert the last value to last_res? - - if( ShouldMakeDump(parameters) ) - { - space->serialize_to_json_stream(out_stream); // we can add pretty print - } + // CHECKME should we convert the last value to last_res? + DumpSpaceIfNeeded(parameters, out_stream, space); } @@ -1275,7 +1291,7 @@ template pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) { std::wstring & next_field = fields[field_index]; - space = space->get_object_field(next_field); + space = space->get_space(next_field); if( !space ) { @@ -1306,10 +1322,7 @@ void Generator::CallSpaceTableForLastField(morm::ModelWrapper & mode last_res = !table->empty(); } - if( ShouldMakeDump(parameters) ) - { - space->serialize_to_json_stream(out_stream); - } + DumpSpaceIfNeeded(parameters, out_stream, space); if( IsCurrentParam(parameters) ) { @@ -1317,7 +1330,7 @@ void Generator::CallSpaceTableForLastField(morm::ModelWrapper & mode if( iterator_value < table->size() ) { - (*table)[iterator_value]->serialize_to_json_stream(out_stream); + (*table)[iterator_value]->serialize_to_string(out_stream); } } @@ -1450,7 +1463,7 @@ bool Generator::CallModel(morm::Model & model, const std::wstring & if( found && !str.empty()) { - bool should_escape = ShouldEscapeValue(parameters); + bool should_escape = HasParam(parameters, L"raw", L"noescape"); CopyStream(str, out_stream, should_escape); }