#include "sax.h" using namespace NConfig; namespace { class TSax: public IConfig, public IConfig::IValue { public: inline TSax(const TConfig& cfg) : C_(cfg) { } void DoForEach(IFunc* func) override { if (C_.IsA()) { const TArray& a = C_.Get(); for (size_t i = 0; i < a.size(); ++i) { TSax slave(a[i]); func->Consume(ToString(i), &slave); } } else if (C_.IsA()) { const TDict& d = C_.Get(); for (const auto& it : d) { TSax slave(it.second); func->Consume(it.first, &slave); } } } TString AsString() override { if (C_.IsA()) { TSax slave(C_.Get()[0]); return slave.AsString(); } return C_.As(); } bool AsBool() override { return C_.As(); } IConfig* AsSubConfig() override { return this; } bool IsContainer() const override { return C_.IsA() || C_.IsA(); } void DumpJson(IOutputStream& stream) const override { C_.DumpJson(stream); } void DumpLua(IOutputStream& stream) const override { C_.DumpLua(stream); } private: TConfig C_; }; } namespace NConfig { THolder ConfigParser(IInputStream& in, const TGlobals& globals) { return MakeHolder(TConfig::FromStream(in, globals)); } }