blob: 893f3647aa14ccf61e474e243a06c7778e58114d [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/**
Radek Krejci75104122021-04-01 15:37:45 +020032 * @defgroup pluginsExtensionsCompile Plugins: Extensions compilation support
33 * @ingroup pluginsExtensions
34 *
35 * Helper functions to implement extension plugin's compile callback.
Radek Krejci5f9a3672021-03-05 21:35:22 +010036 *
37 * @{
38 */
39
40/**
41 * @defgroup scflags Schema compile flags
42 *
43 * Flags to modify schema compilation process and change the way how the particular statements are being compiled. *
44 * @{
45 */
46#define LYS_COMPILE_GROUPING 0x01 /**< Compiling (validation) of a non-instantiated grouping.
47 In this case not all the restrictions are checked since they can
48 be valid only in the real placement of the grouping.
49 TODO - what specifically is not done */
50#define LYS_COMPILE_DISABLED 0x02 /**< Compiling a disabled subtree (by its if-features). Meaning
51 it will be removed at the end of compilation and should not be
52 added to any unres sets. */
53#define LYS_COMPILE_NO_CONFIG 0x04 /**< ignore config statements, neither inherit config value */
54#define LYS_COMPILE_NO_DISABLED 0x08 /**< ignore if-feature statements */
55
56#define LYS_COMPILE_RPC_INPUT (LYS_IS_INPUT | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of RPC/action input */
57#define LYS_COMPILE_RPC_OUTPUT (LYS_IS_OUTPUT | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of RPC/action output */
58#define LYS_COMPILE_NOTIFICATION (LYS_IS_NOTIF | LYS_COMPILE_NO_CONFIG) /**< Internal option when compiling schema tree of Notification */
59
60/** @} scflags */
61
62/**
Radek Krejci0b013302021-03-29 15:22:32 +020063 * @brief YANG schema compilation context for use in ::lyplg_ext_compile_clb callback implementation.
Radek Krejci5f9a3672021-03-05 21:35:22 +010064 *
65 * The structure stores complex information connected with the schema compilation process. In the most simple case,
66 * the callback is just supposed to pass the provided callback to ::lys_compile_extension_instance() functions.
67 *
68 * To access various items from the context, use some of the following lysc_ctx_get_* getters.
69 */
70struct lysc_ctx;
71
72/**
73 * @brief YANG schema compilation context getter for libyang context.
74 * @param[in] ctx YANG schema compilation context.
75 * @return libyang context connected with the compilation context.
76 */
77struct ly_ctx *lysc_ctx_get_ctx(const struct lysc_ctx *ctx);
78
79/**
80 * @brief YANG schema compilation context getter for compilation options.
81 * @param[in] ctx YANG schema compilation context.
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010082 * @return pointer to the compilation options to allow modifying them with @ref scflags values.
Radek Krejci5f9a3672021-03-05 21:35:22 +010083 */
84uint32_t *lysc_ctx_get_options(const struct lysc_ctx *ctx);
85
86/**
87 * @brief YANG schema compilation context getter for path being currently processed.
88 * @param[in] ctx YANG schema compilation context.
89 * @return path identifying the place in schema being currently processed by the schema compiler.
90 */
91const char *lysc_ctx_get_path(const struct lysc_ctx *ctx);
92
93/**
94 * @brief Compile substatements of an extension instance.
95 *
96 * Uses standard libyang schema compiler to transform YANG statements into the compiled schema structures. The plugins are
97 * supposed to use this function when the extension instance's substatements are supposed to be compiled in a standard way
98 * (or if just the @ref scflags are enough to modify the compilation process).
99 *
100 * @param[in] ctx YANG schema compile context to track the compilation state.
101 * @param[in] ext_p Parsed representation of the extension instance being processed.
102 * @param[in,out] ext Compiled extension instance with the prepared ::lysc_ext_instance.substmts array, which will be updated
103 * by storing the compiled data.
104 * @return LY_SUCCESS on success.
105 * @return LY_EVALID if compilation of the substatements fails.
106 * @return LY_ENOT if the extension is disabled (by if-feature) and should be ignored.
107 */
108LY_ERR lys_compile_extension_instance(struct lysc_ctx *ctx, const struct lysp_ext_instance *ext_p, struct lysc_ext_instance *ext);
109
110/**
111 * @brief Update path in the compile context, which is used for logging where the compilation failed.
112 *
113 * @param[in] ctx Compile context with the path.
114 * @param[in] parent_module Module of the current node's parent to check difference with the currently processed module (taken from @p ctx).
115 * @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
116 * call updates the segment to the form `{keyword='name'}` (to remove this compound segment, 2 calls with NULL @p name must be used).
117 */
118void lysc_update_path(struct lysc_ctx *ctx, struct lys_module *parent_module, const char *name);
119
120/**
121 * @brief Duplicate the compiled extension (definition) structure.
122 * TODO should this be in API? currently required by nacm_compile()
123 * Instead of duplicating memory, the reference counter in the @p orig is increased.
124 *
125 * @param[in] orig The extension structure to duplicate.
126 * @return The duplicated structure to use.
127 */
128struct lysc_ext *lysc_ext_dup(struct lysc_ext *orig);
129
130/** @} extensions */
131
132#ifdef __cplusplus
133}
134#endif
135
136#endif /* LY_PLUGINS_EXTS_COMPILE_H_ */