aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/vespa/vespalib/net/http/slime_explorer.cpp
blob: dc61f673233d47a8fd1ac375c125de42cc3c0206 (plain) (blame)
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
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "slime_explorer.h"

namespace vespalib {

namespace {

struct SelfState : slime::ObjectTraverser {
    Slime result;
    SelfState() : result() { result.setObject(); }
    void field(const Memory &key, const slime::Inspector &value) override {
        if (value.type().getId() != slime::OBJECT::ID) {
            slime::inject(value, slime::ObjectInserter(result.get(), key));
        }
    }
};

struct ChildrenNames : slime::ObjectTraverser {
    std::vector<vespalib::string> result;
    void field(const Memory &key, const slime::Inspector &value) override {
        if (value.type().getId() == slime::OBJECT::ID) {
            result.push_back(key.make_string());
        }
    }
};

} // namespace vespalib::<unnamed>

void
SlimeExplorer::get_state(const slime::Inserter &inserter, bool full) const
{
    SelfState state;
    _self.traverse(state);
    if (state.result.get().fields() > 0) {
        if (full) {
            state.result.get().setBool("full", true);
        }
        slime::inject(state.result.get(), inserter);
    }
}

std::vector<vespalib::string>
SlimeExplorer::get_children_names() const
{
    ChildrenNames names;
    _self.traverse(names);
    return names.result;
}

std::unique_ptr<StateExplorer>
SlimeExplorer::get_child(vespalib::stringref name) const
{
    slime::Inspector &child = _self[name];
    if (!child.valid()) {
        return std::unique_ptr<StateExplorer>(nullptr);
    }
    return std::unique_ptr<StateExplorer>(new SlimeExplorer(child));
}

} // namespace vespalib