blob: 48f3c423883f2e6bddfc0432701ab6a393712c7c [file] [log] [blame]
Radek Krejcid3ca0632019-04-16 16:54:54 +02001/**
2 * @file printer_internal.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief Internal structures and functions for libyang
5 *
6 * Copyright (c) 2015-2019 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_PRINTER_INTERNAL_H_
16#define LY_PRINTER_INTERNAL_H_
17
Michal Vaskoafac7822020-10-20 14:22:26 +020018#include "out.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020019#include "printer_data.h"
Michal Vasko69730152020-10-09 16:30:07 +020020#include "printer_schema.h"
Radek Krejcid3ca0632019-04-16 16:54:54 +020021
Michal Vasko7c8439f2020-08-05 13:25:19 +020022struct lysp_module;
23struct lysp_submodule;
24
Radek Krejcie7b95092019-05-15 11:03:07 +020025/**
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010026 * @brief Generic YANG schema printer context
27 *
28 * Note that the YANG extensions API provides getter to the members for the extension plugins.
29 */
30struct lyspr_ctx {
31 struct ly_out *out; /**< output specification */
32 uint16_t level; /**< current indentation level: 0 - no formatting, >= 1 indentation levels */
Radek Krejciaa14a0c2020-09-04 11:16:47 +020033 uint16_t flags; /**< internal flags for use by printer */
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010034 uint32_t options; /**< Schema output options (see @ref schemaprinterflags). */
35 const struct lys_module *module; /**< schema to print */
36};
37
38/**
Michal Vasko7c8439f2020-08-05 13:25:19 +020039 * @brief YANG printer of the parsed module. Full YANG printer.
Radek Krejcie7b95092019-05-15 11:03:07 +020040 *
41 * @param[in] out Output specification.
Michal Vasko7c8439f2020-08-05 13:25:19 +020042 * @param[in] modp Parsed module to print.
Radek Krejci5536d282020-08-04 23:27:44 +020043 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +020044 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Radek Krejcid3ca0632019-04-16 16:54:54 +020045 */
Michal Vasko7997d5a2021-02-22 10:55:56 +010046LY_ERR yang_print_parsed_module(struct ly_out *out, const struct lysp_module *modp, uint32_t options);
Radek Krejci5536d282020-08-04 23:27:44 +020047
48/**
49 * @brief Helper macros for data printers
50 */
Michal Vasko61ad1ff2022-02-10 15:48:39 +010051#define DO_FORMAT (!(pctx->options & LY_PRINT_SHRINK))
52#define LEVEL pctx->level /**< current level */
Radek Krejci5536d282020-08-04 23:27:44 +020053#define INDENT (DO_FORMAT ? (LEVEL)*2 : 0),"" /**< indentation parameters for printer functions */
54#define LEVEL_INC LEVEL++ /**< increase indentation level */
55#define LEVEL_DEC LEVEL-- /**< decrease indentation level */
Michal Vasko7c8439f2020-08-05 13:25:19 +020056
Radek Krejcif13b87b2020-12-01 22:02:17 +010057#define XML_NS_INDENT 8
58
Michal Vasko7c8439f2020-08-05 13:25:19 +020059/**
60 * @brief YANG printer of the parsed submodule. Full YANG printer.
61 *
62 * @param[in] out Output specification.
Michal Vasko7c8439f2020-08-05 13:25:19 +020063 * @param[in] submodp Parsed submodule to print.
Radek Krejci5536d282020-08-04 23:27:44 +020064 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +020065 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Michal Vasko7c8439f2020-08-05 13:25:19 +020066 */
Michal Vasko7997d5a2021-02-22 10:55:56 +010067LY_ERR yang_print_parsed_submodule(struct ly_out *out, const struct lysp_submodule *submodp, uint32_t options);
Radek Krejcid3ca0632019-04-16 16:54:54 +020068
69/**
Radek Krejcie7b95092019-05-15 11:03:07 +020070 * @brief YANG printer of the compiled schemas.
71 *
72 * This printer provides information about modules how they are understood by libyang.
73 * Despite the format is inspired by YANG, it is not fully compatible and should not be
74 * used as a standard YANG format.
75 *
76 * @param[in] out Output specification.
77 * @param[in] module Schema to be printed (the compiled member is used).
Radek Krejcid8c0f5e2019-11-17 12:18:34 +080078 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +020079 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Radek Krejcid3ca0632019-04-16 16:54:54 +020080 */
Radek Krejci1deb5be2020-08-26 16:43:36 +020081LY_ERR yang_print_compiled(struct ly_out *out, const struct lys_module *module, uint32_t options);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +080082
83/**
84 * @brief YANG printer of the compiled schema node
85 *
86 * This printer provides information about modules how they are understood by libyang.
87 * Despite the format is inspired by YANG, it is not fully compatible and should not be
88 * used as a standard YANG format.
89 *
90 * @param[in] out Output specification.
91 * @param[in] node Schema node to be printed including all its substatements.
92 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +020093 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Radek Krejcid8c0f5e2019-11-17 12:18:34 +080094 */
Radek Krejci1deb5be2020-08-26 16:43:36 +020095LY_ERR yang_print_compiled_node(struct ly_out *out, const struct lysc_node *node, uint32_t options);
Radek Krejcid3ca0632019-04-16 16:54:54 +020096
Radek Krejcie7b95092019-05-15 11:03:07 +020097/**
Michal Vasko7c8439f2020-08-05 13:25:19 +020098 * @brief YIN printer of the parsed module. Full YIN printer.
FredGand944bdc2019-11-05 21:57:07 +080099 *
100 * @param[in] out Output specification.
Michal Vasko7c8439f2020-08-05 13:25:19 +0200101 * @param[in] modp Parsed module to print.
Radek Krejci5536d282020-08-04 23:27:44 +0200102 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +0200103 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
FredGand944bdc2019-11-05 21:57:07 +0800104 */
Michal Vasko7997d5a2021-02-22 10:55:56 +0100105LY_ERR yin_print_parsed_module(struct ly_out *out, const struct lysp_module *modp, uint32_t options);
Michal Vasko7c8439f2020-08-05 13:25:19 +0200106
107/**
108 * @brief YIN printer of the parsed submodule. Full YIN printer.
109 *
110 * @param[in] out Output specification.
Michal Vasko7c8439f2020-08-05 13:25:19 +0200111 * @param[in] submodp Parsed submodule to print.
Radek Krejci5536d282020-08-04 23:27:44 +0200112 * @param[in] options Schema output options (see @ref schemaprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +0200113 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Michal Vasko7c8439f2020-08-05 13:25:19 +0200114 */
Michal Vasko7997d5a2021-02-22 10:55:56 +0100115LY_ERR yin_print_parsed_submodule(struct ly_out *out, const struct lysp_submodule *submodp, uint32_t options);
FredGand944bdc2019-11-05 21:57:07 +0800116
117/**
aPiecek3f247652021-04-19 13:40:25 +0200118 * @brief Full YANG Tree Diagram printer.
119 *
120 * The module should be compiled and the @ref contextoptions must be set to LY_CTX_SET_PRIV_PARSED.
121 * If not, the printer will use parsed (unresolved) YANG schema tree, which means,
122 * for example, that `grouping` sections will be on the output.
aPiecek61d062b2020-11-02 11:05:09 +0100123 *
124 * @param[in] out Output specification.
125 * @param[in] module Main module.
126 * @param[in] options Schema output options (see @ref schemaprinterflags).
127 * @param[in] line_length Maximum characters to be printed on a line, 0 for unlimited. Only for ::LYS_OUT_TREE printer.
128 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
129 */
aPiecek3f247652021-04-19 13:40:25 +0200130LY_ERR tree_print_module(struct ly_out *out, const struct lys_module *module, uint32_t options,
aPiecek61d062b2020-11-02 11:05:09 +0100131 size_t line_length);
132
133/**
aPiecek9f792e52021-04-21 08:33:56 +0200134 * @brief YANG Tree Diagram printer of the parsed submodule. Full Tree printer.
135 *
136 * @param[in] out Output specification.
137 * @param[in] submodp Parsed submodule to print.
138 * @param[in] options Schema output options (see @ref schemaprinterflags).
139 * @param[in] line_length Maximum characters to be printed on a line, 0 for unlimited. Only for ::LYS_OUT_TREE printer.
140 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
141 */
142LY_ERR tree_print_parsed_submodule(struct ly_out *out, const struct lysp_submodule *submodp, uint32_t options,
143 size_t line_length);
144
145/**
146 * @brief YANG Tree Diagram printer of the compiled schema node.
aPiecek153b00f2021-04-20 13:52:57 +0200147 *
148 * @param[in] out Output specification.
149 * @param[in] node Schema node to be printed including all its substatements.
150 * @param[in] options Schema output options (see @ref schemaprinterflags).
151 * @param[in] line_length Maximum characters to be printed on a line, 0 for unlimited. Only for ::LYS_OUT_TREE printer.
152 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
153 */
154LY_ERR tree_print_compiled_node(struct ly_out *out, const struct lysc_node *node, uint32_t options,
155 size_t line_length);
156
157/**
Michal Vasko60ea6352020-06-29 13:39:39 +0200158 * @brief XML printer of YANG data.
Radek Krejcie7b95092019-05-15 11:03:07 +0200159 *
160 * @param[in] out Output specification.
161 * @param[in] root The root element of the (sub)tree to print.
162 * @param[in] options [Data printer flags](@ref dataprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +0200163 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Radek Krejcie7b95092019-05-15 11:03:07 +0200164 */
Radek Krejci1deb5be2020-08-26 16:43:36 +0200165LY_ERR xml_print_data(struct ly_out *out, const struct lyd_node *root, uint32_t options);
Radek Krejcie7b95092019-05-15 11:03:07 +0200166
167/**
Radek Krejci5536d282020-08-04 23:27:44 +0200168 * @brief JSON printer of YANG data.
169 *
170 * @param[in] out Output specification.
171 * @param[in] root The root element of the (sub)tree to print.
172 * @param[in] options [Data printer flags](@ref dataprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +0200173 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Radek Krejci5536d282020-08-04 23:27:44 +0200174 */
Radek Krejci1deb5be2020-08-26 16:43:36 +0200175LY_ERR json_print_data(struct ly_out *out, const struct lyd_node *root, uint32_t options);
Radek Krejci5536d282020-08-04 23:27:44 +0200176
177/**
Michal Vasko60ea6352020-06-29 13:39:39 +0200178 * @brief LYB printer of YANG data.
179 *
180 * @param[in] out Output structure.
181 * @param[in] root The root element of the (sub)tree to print.
182 * @param[in] options [Data printer flags](@ref dataprinterflags).
Radek Krejci8678fa42020-08-18 16:07:28 +0200183 * @return LY_ERR value, number of the printed bytes is updated in ::ly_out.printed.
Michal Vasko60ea6352020-06-29 13:39:39 +0200184 */
Radek Krejci1deb5be2020-08-26 16:43:36 +0200185LY_ERR lyb_print_data(struct ly_out *out, const struct lyd_node *root, uint32_t options);
Michal Vasko60ea6352020-06-29 13:39:39 +0200186
Radek Krejcid3ca0632019-04-16 16:54:54 +0200187#endif /* LY_PRINTER_INTERNAL_H_ */