blob: 2dfde6a6af3064c4fb90b64c0a1e8d35a3d39e6e [file] [log] [blame]
Radek Krejci5f9a3672021-03-05 21:35:22 +01001/**
2 * @file plugins_exts_compile.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief libyang support for YANG extensions implementation - schema compilation related items.
5 *
6 * Copyright (c) 2015 - 2021 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
15#ifndef LY_PLUGINS_EXTS_COMPILE_H_
16#define LY_PLUGINS_EXTS_COMPILE_H_
17
18#include <stdint.h>
19
20#include "log.h"
21#include "tree_schema.h"
22
23struct ly_ctx;
24struct lyd_node;
25struct lysc_ctx;
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31/**
32 * @ingroup extensions YANG Extensions
33 *
34 * @{
35 */
36
37/**
38 * @defgroup scflags Schema compile flags
39 *
40 * Flags to modify schema compilation process and change the way how the particular statements are being compiled. *
41 * @{
42 */
43#define LYS_COMPILE_GROUPING 0x01 /**< Compiling (validation) of a non-instantiated grouping.
44 In this case not all the restrictions are checked since they can
45 be valid only in the real placement of the grouping.
46 TODO - what specifically is not done */
47#define LYS_COMPILE_DISABLED 0x02 /**< Compiling a disabled subtree (by its if-features). Meaning
48 it will be removed at the end of compilation and should not be
49 added to any unres sets. */
50#define LYS_COMPILE_NO_CONFIG 0x04 /**< ignore config statements, neither inherit config value */
51#define LYS_COMPILE_NO_DISABLED 0x08 /**< ignore if-feature statements */
52
53#define LYS_COMPILE_RPC_INPUT (LYS_IS_INPUT | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of RPC/action input */
54#define LYS_COMPILE_RPC_OUTPUT (LYS_IS_OUTPUT | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of RPC/action output */
55#define LYS_COMPILE_NOTIFICATION (LYS_IS_NOTIF | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of Notification */
56
57/** @} scflags */
58
59/**
Radek Krejci0b013302021-03-29 15:22:32 +020060 * @brief YANG schema compilation context for use in ::lyplg_ext_compile_clb callback implementation.
Radek Krejci5f9a3672021-03-05 21:35:22 +010061 *
62 * The structure stores complex information connected with the schema compilation process. In the most simple case,
63 * the callback is just supposed to pass the provided callback to ::lys_compile_extension_instance() functions.
64 *
65 * To access various items from the context, use some of the following lysc_ctx_get_* getters.
66 */
67struct lysc_ctx;
68
69/**
70 * @brief YANG schema compilation context getter for libyang context.
71 * @param[in] ctx YANG schema compilation context.
72 * @return libyang context connected with the compilation context.
73 */
74struct ly_ctx *lysc_ctx_get_ctx(const struct lysc_ctx *ctx);
75
76/**
77 * @brief YANG schema compilation context getter for compilation options.
78 * @param[in] ctx YANG schema compilation context.
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010079 * @return pointer to the compilation options to allow modifying them with @ref scflags values.
Radek Krejci5f9a3672021-03-05 21:35:22 +010080 */
81uint32_t *lysc_ctx_get_options(const struct lysc_ctx *ctx);
82
83/**
84 * @brief YANG schema compilation context getter for path being currently processed.
85 * @param[in] ctx YANG schema compilation context.
86 * @return path identifying the place in schema being currently processed by the schema compiler.
87 */
88const char *lysc_ctx_get_path(const struct lysc_ctx *ctx);
89
90/**
91 * @brief Compile substatements of an extension instance.
92 *
93 * Uses standard libyang schema compiler to transform YANG statements into the compiled schema structures. The plugins are
94 * supposed to use this function when the extension instance's substatements are supposed to be compiled in a standard way
95 * (or if just the @ref scflags are enough to modify the compilation process).
96 *
97 * @param[in] ctx YANG schema compile context to track the compilation state.
98 * @param[in] ext_p Parsed representation of the extension instance being processed.
99 * @param[in,out] ext Compiled extension instance with the prepared ::lysc_ext_instance.substmts array, which will be updated
100 * by storing the compiled data.
101 * @return LY_SUCCESS on success.
102 * @return LY_EVALID if compilation of the substatements fails.
103 * @return LY_ENOT if the extension is disabled (by if-feature) and should be ignored.
104 */
105LY_ERR lys_compile_extension_instance(struct lysc_ctx *ctx, const struct lysp_ext_instance *ext_p, struct lysc_ext_instance *ext);
106
107/**
108 * @brief Update path in the compile context, which is used for logging where the compilation failed.
109 *
110 * @param[in] ctx Compile context with the path.
111 * @param[in] parent_module Module of the current node's parent to check difference with the currently processed module (taken from @p ctx).
112 * @param[in] name Name of the node to update path with. If NULL, the last segment is removed. If the format is `{keyword}`, the following
113 * call updates the segment to the form `{keyword='name'}` (to remove this compound segment, 2 calls with NULL @p name must be used).
114 */
115void lysc_update_path(struct lysc_ctx *ctx, struct lys_module *parent_module, const char *name);
116
117/**
118 * @brief Duplicate the compiled extension (definition) structure.
119 * TODO should this be in API? currently required by nacm_compile()
120 * Instead of duplicating memory, the reference counter in the @p orig is increased.
121 *
122 * @param[in] orig The extension structure to duplicate.
123 * @return The duplicated structure to use.
124 */
125struct lysc_ext *lysc_ext_dup(struct lysc_ext *orig);
126
127/** @} extensions */
128
129#ifdef __cplusplus
130}
131#endif
132
133#endif /* LY_PLUGINS_EXTS_COMPILE_H_ */