blob: c61232f60d26ec5e78abce812a7263f511d7d7ee [file] [log] [blame]
Václav Kubernát0d4db442018-07-18 17:18:43 +02001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
3 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
4 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8
9#pragma once
10
Václav Kubernáta6c5fff2018-09-07 15:16:25 +020011#include <functional>
Václav Kubernát0d4db442018-07-18 17:18:43 +020012#include <set>
13#include <stdexcept>
14#include <unordered_map>
15#include "ast_path.hpp"
16#include "schema.hpp"
17
Jan Kundrát4ed0e9f2018-08-23 16:56:58 +020018namespace libyang {
Václav Kubernát0d4db442018-07-18 17:18:43 +020019class Context;
20class Set;
21class Schema_Node;
Jan Kundrát4ed0e9f2018-08-23 16:56:58 +020022}
Václav Kubernát0d4db442018-07-18 17:18:43 +020023
24/*! \class YangSchema
25 * \brief A schema class, which uses libyang for queries.
26 * */
27class YangSchema : public Schema {
28public:
29 YangSchema();
30 ~YangSchema() override;
31
32 bool isContainer(const path_& location, const ModuleNodePair& node) const override;
33 bool isLeaf(const path_& location, const ModuleNodePair& node) const override;
34 bool isModule(const path_& location, const std::string& name) const override;
35 bool isList(const path_& location, const ModuleNodePair& node) const override;
36 bool isPresenceContainer(const path_& location, const ModuleNodePair& node) const override;
37 bool leafEnumHasValue(const path_& location, const ModuleNodePair& node, const std::string& value) const override;
38 bool listHasKey(const path_& location, const ModuleNodePair& node, const std::string& key) const override;
39 bool nodeExists(const std::string& location, const std::string& node) const override;
40 const std::set<std::string> listKeys(const path_& location, const ModuleNodePair& node) const override;
41 yang::LeafDataTypes leafType(const path_& location, const ModuleNodePair& node) const override;
Václav Kubernáte7d4aea2018-09-11 18:15:48 +020042 std::set<std::string> childNodes(const path_& path, const Recursion recursion) const override;
Václav Kubernát0d4db442018-07-18 17:18:43 +020043
Václav Kubernáta6c5fff2018-09-07 15:16:25 +020044 void registerModuleCallback(const std::function<std::string(const char*, const char*, const char*)>& clb);
45
46 /** @short Loads a module called moduleName. */
47 void loadModule(const std::string& moduleName);
48
Václav Kubernát0d4db442018-07-18 17:18:43 +020049 /** @short Adds a new module passed as a YANG string. */
50 void addSchemaString(const char* schema);
51
52 /** @short Adds a new module from a file. */
53 void addSchemaFile(const char* filename);
54
55 /** @short Adds a new directory for schema lookup. */
56 void addSchemaDirectory(const char* directoryName);
57
58private:
59 std::set<std::string> modules() const;
60 bool nodeExists(const path_& location, const ModuleNodePair& node) const;
61
62 /** @short Returns a set of nodes, that match the location and name criteria. */
Jan Kundrát4ed0e9f2018-08-23 16:56:58 +020063 std::shared_ptr<libyang::Set> getNodeSet(const path_& location, const ModuleNodePair& node) const;
Václav Kubernát0d4db442018-07-18 17:18:43 +020064
65 /** @short Returns a single Schema_Node if the criteria matches only one, otherwise nullptr. */
Jan Kundrát4ed0e9f2018-08-23 16:56:58 +020066 std::shared_ptr<libyang::Schema_Node> getSchemaNode(const path_& location, const ModuleNodePair& node) const;
67 std::shared_ptr<libyang::Context> m_context;
Václav Kubernát0d4db442018-07-18 17:18:43 +020068};