root/src/JsonTag.cpp

////////////////////////////////////////////////////////////////////////
// Copyright (c) Nehmulos 2011-2014
// This file is part of N0 Strain Serialization Library.
//
// N0Strain-Serialization-Library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// N0Strain-Serialization-Library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with N0Strain-Serialization-Library.  If not, see https://gnu.org/licenses/lgpl-3.0
////////////////////////////////////////////////////////////////////////




#include "JsonTag.h"

namespace nw
{

JsonTag::JsonTag() : Tag()
{
        valueType = JsonType::Invalid;
        // TODO Auto-generated constructor stub

}

JsonTag::JsonTag(const String tagName) : Tag(tagName)
{
        valueType = JsonType::Invalid;
}

JsonTag::~JsonTag()
{
        // TODO Auto-generated destructor stub
}

Tag* JsonTag::addNewChild(String tagName)
{
    return addJsonChild(tagName, JsonType::Object);
}

Tag* JsonTag::addJsonChild(const String childName, JsonType::Enum type, String stringValue)
{
        JsonTag* child = new JsonTag(childName);
        child->setValue(stringValue);
        child->setType(type);
        child->setParent(this);
        child->setLevel(this->level+1);
        addChild(child);
        return child;
}

void JsonTag::setType(JsonType::Enum type)
{
        this->valueType = type;
}

void JsonTag::writeAsJson(std::ostream& file)
{
        file << "{\n";
        for(unsigned int i=0; i < children.size(); i++)
        {
                if(i != 0)
                        static_cast<JsonTag*>(children.at(i))->writeJsonTag(file, true);
                else
                        static_cast<JsonTag*>(children.at(i))->writeJsonTag(file, false);
        }
        file << "\n}";
}

void JsonTag::writeJsonTag(std::ostream& file, bool trailingComma)
{
        std::stringstream tabs;
        for (int i = 0; i < this->level; ++i)
        {
                tabs << "    ";
        }

        if(trailingComma)
                file << ",\n";

        if(this->hasChildren())
        {
                if(!name.empty())
                        file << tabs.str() << '"' << name << "\":";

                if(this->valueType == JsonType::Array)
                        file << '\n' << tabs.str() << "[";
                else
                        file << '\n' << tabs.str() << "{";

                for(unsigned int i=0; i < children.size(); ++i)
                {
                        if(i != 0) {
                                static_cast<JsonTag*>(children.at(i))->writeJsonTag(file, true);
                        } else {
                                file << '\n';
                                static_cast<JsonTag*>(children.at(i))->writeJsonTag(file, false);
                        }
                }

                if(this->valueType == JsonType::Array)
                        file << '\n' << tabs.str() << ']';
                else
                        file << '\n' << tabs.str() << '}';
        }
        else
        {
                file << tabs.str();

                if(!name.empty())
                        file << '"' << name << "\":";

                if(this->valueType == JsonType::Array)
                        file << "[]";
                else if(this->valueType == JsonType::String)
                        file << '"' << value << '"';
                else
                        file << value;
        }
}

}