~aleteoryx/muditaos

ref: 389ce032ae776ecb572a5b2add829a527d416365 muditaos/module-gui/gui/dom/Item2JsonSerializer.cpp -rw-r--r-- 2.3 KiB
389ce032 — Mateusz Szczesny [BH-1720] Changed GDB python to python 3 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "Item2JsonSerializer.hpp"
#include "visitor/ItemNode.hpp"
#include "visitor/DepthFirstItemTree.hpp"
#include "ItemDataNames.hpp"

#include <magic_enum.hpp>
using namespace gui;

void Item2JsonSerializer::handleSibling(gui::ItemNode &node, prototype &doc, int &level)
{
    node.getItem().accept(visitor);
    doc[level].emplace_back(json11::Json::object{{visitor.moveName(), visitor.moveState()}});
}

void Item2JsonSerializer::handleParent(gui::ItemNode &node, prototype &doc, int &level)
{
    auto parentLevel = node.getLevel();
    auto children    = json11::Json::array{};

    while (!doc[level].empty()) {
        auto &&child = doc[level].front();
        children.emplace_back(std::move(child));
        doc[level].pop_front();
    }

    doc[level].clear();
    level = parentLevel;

    node.getItem().accept(visitor);
    auto parent = visitor.moveState();
    parent.emplace(magic_enum::enum_name(visitor::Names::Children), std::move(children));
    doc[level].emplace_back(json11::Json::object{{visitor.moveName(), std::move(parent)}});
}

void Item2JsonSerializer::handleOther(gui::ItemNode &node, prototype &doc, int &level)
{
    level      = node.getLevel();
    doc[level] = std::list<json11::Json::object>{};

    node.getItem().accept(visitor);
    doc[level].emplace_back(json11::Json::object{{visitor.moveName(), visitor.moveState()}});
}

void Item2JsonSerializer::traverse(gui::Item &root)
{
    int level = ItemNode::rootLevel;
    prototype documentPrototype;
    DepthFirstItemTree nodes(root, DepthFirstItemTree::TraverseMode::PostOrder);

    while (nodes.hasNext()) {
        auto node = nodes.getNext();
        if (node.getLevel() == level) {
            handleSibling(node, documentPrototype, level);
        }
        else if (node.getLevel() < level) {
            handleParent(node, documentPrototype, level);
        }
        else {
            handleOther(node, documentPrototype, level);
        }
    }
    document = json11::Json(std::move(documentPrototype[0].front()));
}

void Item2JsonSerializer::dump(std::ostream &stream)
{
    stream << document.dump();
}

[[nodiscard]] auto Item2JsonSerializer::get() -> json11::Json &&
{
    return std::move(document);
}