From 08aa252611843b93c4f98959fe89c81b872224ae Mon Sep 17 00:00:00 2001 From: Chen Date: Mon, 29 Jun 2020 12:31:53 +0800 Subject: [PATCH] Support kinds of emitter format-setting for YAML::Null. (#906) * Support kinds of emitter format-setting for YAML::Null. * update the code and test cases * add the comment //fallthrough --- include/yaml-cpp/emitter.h | 2 ++ include/yaml-cpp/emittermanip.h | 6 +++++ src/.emitterstate.h.swp | Bin 0 -> 16384 bytes src/emitter.cpp | 21 +++++++++++++++- src/emitterstate.cpp | 15 ++++++++++++ src/emitterstate.h | 4 +++ test/integration/emitter_test.cpp | 39 ++++++++++++++++++++++++++++++ 7 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/.emitterstate.h.swp diff --git a/include/yaml-cpp/emitter.h b/include/yaml-cpp/emitter.h index 2add9ee..675a2ae 100644 --- a/include/yaml-cpp/emitter.h +++ b/include/yaml-cpp/emitter.h @@ -50,6 +50,7 @@ class YAML_CPP_API Emitter { bool SetOutputCharset(EMITTER_MANIP value); bool SetStringFormat(EMITTER_MANIP value); bool SetBoolFormat(EMITTER_MANIP value); + bool SetNullFormat(EMITTER_MANIP value); bool SetIntBase(EMITTER_MANIP value); bool SetSeqFormat(EMITTER_MANIP value); bool SetMapFormat(EMITTER_MANIP value); @@ -123,6 +124,7 @@ class YAML_CPP_API Emitter { void SpaceOrIndentTo(bool requireSpace, std::size_t indent); const char* ComputeFullBoolName(bool b) const; + const char* ComputeNullName() const; bool CanEmitNewline() const; private: diff --git a/include/yaml-cpp/emittermanip.h b/include/yaml-cpp/emittermanip.h index 22691bc..010d860 100644 --- a/include/yaml-cpp/emittermanip.h +++ b/include/yaml-cpp/emittermanip.h @@ -26,6 +26,12 @@ enum EMITTER_MANIP { DoubleQuoted, Literal, + // null manipulators + LowerNull, + UpperNull, + CamelNull, + TildeNull, + // bool manipulators YesNoBool, // yes, no TrueFalseBool, // true, false diff --git a/src/.emitterstate.h.swp b/src/.emitterstate.h.swp new file mode 100644 index 0000000000000000000000000000000000000000..c60f60a59f49d031e4b86da7f0b3afd6a5453c91 GIT binary patch literal 16384 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, FmtScope::Global); +} + bool Emitter::SetIntBase(EMITTER_MANIP value) { return m_pState->SetIntFormat(value, FmtScope::Global); } @@ -770,6 +774,21 @@ const char* Emitter::ComputeFullBoolName(bool b) const { // these answers } +const char* Emitter::ComputeNullName() const { + switch (m_pState->GetNullFormat()) { + case LowerNull: + return "null"; + case UpperNull: + return "NULL"; + case CamelNull: + return "Null"; + case TildeNull: + // fallthrough + default: + return "~"; + } +} + Emitter& Emitter::Write(bool b) { if (!good()) return *this; @@ -893,7 +912,7 @@ Emitter& Emitter::Write(const _Null& /*null*/) { PrepareNode(EmitterNodeType::Scalar); - m_stream << "~"; + m_stream << ComputeNullName(); StartedScalar(); diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index d50106c..59b3752 100644 --- a/src/emitterstate.cpp +++ b/src/emitterstate.cpp @@ -13,6 +13,7 @@ EmitterState::EmitterState() m_boolFmt(TrueFalseBool), m_boolLengthFmt(LongBool), m_boolCaseFmt(LowerCase), + m_nullFmt(TildeNull), m_intFmt(Dec), m_indent(2), m_preCommentIndent(2), @@ -43,6 +44,7 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) { SetBoolFormat(value, FmtScope::Local); SetBoolCaseFormat(value, FmtScope::Local); SetBoolLengthFormat(value, FmtScope::Local); + SetNullFormat(value, FmtScope::Local); SetIntFormat(value, FmtScope::Local); SetFlowType(GroupType::Seq, value, FmtScope::Local); SetFlowType(GroupType::Map, value, FmtScope::Local); @@ -279,6 +281,19 @@ bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value, } } +bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) { + switch (value) { + case LowerNull: + case UpperNull: + case CamelNull: + case TildeNull: + _Set(m_nullFmt, value, scope); + return true; + default: + return false; + } +} + bool EmitterState::SetIntFormat(EMITTER_MANIP value, FmtScope::value scope) { switch (value) { case Dec: diff --git a/src/emitterstate.h b/src/emitterstate.h index 75e2166..52c09ce 100644 --- a/src/emitterstate.h +++ b/src/emitterstate.h @@ -91,6 +91,9 @@ class EmitterState { bool SetBoolCaseFormat(EMITTER_MANIP value, FmtScope::value scope); EMITTER_MANIP GetBoolCaseFormat() const { return m_boolCaseFmt.get(); } + bool SetNullFormat(EMITTER_MANIP value, FmtScope::value scope); + EMITTER_MANIP GetNullFormat() const { return m_nullFmt.get(); } + bool SetIntFormat(EMITTER_MANIP value, FmtScope::value scope); EMITTER_MANIP GetIntFormat() const { return m_intFmt.get(); } @@ -131,6 +134,7 @@ class EmitterState { Setting m_boolFmt; Setting m_boolLengthFmt; Setting m_boolCaseFmt; + Setting m_nullFmt; Setting m_intFmt; Setting m_indent; Setting m_preCommentIndent, m_postCommentIndent; diff --git a/test/integration/emitter_test.cpp b/test/integration/emitter_test.cpp index 8e1ee29..04adadf 100644 --- a/test/integration/emitter_test.cpp +++ b/test/integration/emitter_test.cpp @@ -1047,6 +1047,45 @@ TEST_F(EmitterTest, BoolFormatting) { "- Y\n- Y\n- y\n- N\n- N\n- n"); } +TEST_F(EmitterTest, GlobalNullFormatting) { + out << Flow << BeginSeq; + out.SetNullFormat(LowerNull); + out << Null; + out.SetNullFormat(UpperNull); + out << Null; + out.SetNullFormat(CamelNull); + out << Null; + out.SetNullFormat(TildeNull); + out << Null; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + +TEST_F(EmitterTest, NullFormatting) { + out << Flow << BeginSeq; + out << LowerNull << Null; + out << UpperNull << Null; + out << CamelNull << Null; + out << TildeNull << Null; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + +TEST_F(EmitterTest, NullFormattingOnNode) { + Node n(Load("null")); + out << Flow << BeginSeq; + out.SetNullFormat(LowerNull); + out << n; + out.SetNullFormat(UpperNull); + out << n; + out.SetNullFormat(CamelNull); + out << n; + out.SetNullFormat(TildeNull); + out << n; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + // TODO: Fix this test. // TEST_F(EmitterTest, DocStartAndEnd) { // out << BeginDoc;