blob: 1e14a205b022ed3c828e429e10fe5fdc83199a53 [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;
Radek Krejci5f9a3672021-03-05 21:35:22 +010024struct lysc_ctx;
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/**
Radek Krejci75104122021-04-01 15:37:45 +020031 * @defgroup pluginsExtensionsCompile Plugins: Extensions compilation support
32 * @ingroup pluginsExtensions
33 *
34 * Helper functions to implement extension plugin's compile callback.
Radek Krejci5f9a3672021-03-05 21:35:22 +010035 *
36 * @{
37 */
38
39/**
40 * @defgroup scflags Schema compile flags
41 *
42 * Flags to modify schema compilation process and change the way how the particular statements are being compiled. *
43 * @{
44 */
45#define LYS_COMPILE_GROUPING 0x01 /**< Compiling (validation) of a non-instantiated grouping.
46 In this case not all the restrictions are checked since they can
Radek Krejci4e391232021-04-15 14:41:26 +020047 be valid only in the real placement of the grouping. This is
48 the case of any restriction that needs to look out of the statements
49 themselves, since the context is not known. */
Radek Krejci5f9a3672021-03-05 21:35:22 +010050#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 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +010077LIBYANG_API_DECL struct ly_ctx *lysc_ctx_get_ctx(const struct lysc_ctx *ctx);
Radek Krejci5f9a3672021-03-05 21:35:22 +010078
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 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +010084LIBYANG_API_DECL uint32_t *lysc_ctx_get_options(const struct lysc_ctx *ctx);
Radek Krejci5f9a3672021-03-05 21:35:22 +010085
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 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +010091LIBYANG_API_DECL const char *lysc_ctx_get_path(const struct lysc_ctx *ctx);
Radek Krejci5f9a3672021-03-05 21:35:22 +010092
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 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +0100108LIBYANG_API_DECL LY_ERR lys_compile_extension_instance(struct lysc_ctx *ctx, const struct lysp_ext_instance *ext_p, struct lysc_ext_instance *ext);
Radek Krejci5f9a3672021-03-05 21:35:22 +0100109
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 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +0100118LIBYANG_API_DECL void lysc_update_path(struct lysc_ctx *ctx, struct lys_module *parent_module, const char *name);
Radek Krejci5f9a3672021-03-05 21:35:22 +0100119
120/**
121 * @brief Duplicate the compiled extension (definition) structure.
Radek Krejci5f9a3672021-03-05 21:35:22 +0100122 *
123 * @param[in] orig The extension structure to duplicate.
124 * @return The duplicated structure to use.
125 */
Jan Kundrátc53a7ec2021-12-09 16:01:19 +0100126LIBYANG_API_DECL struct lysc_ext *lysc_ext_dup(struct lysc_ext *orig);
Radek Krejci5f9a3672021-03-05 21:35:22 +0100127
128/** @} extensions */
129
130#ifdef __cplusplus
131}
132#endif
133
134#endif /* LY_PLUGINS_EXTS_COMPILE_H_ */