summaryrefslogtreecommitdiff
path: root/src/libcharon/plugins/vici/vici_builder.h
blob: f7d21eb8ff9061a8c139e1c9e5dd9a8d85e2653c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Copyright (C) 2014 Martin Willi
 * Copyright (C) 2014 revosec AG
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

/**
 * @defgroup vici_builder vici_builder
 * @{ @ingroup vici
 */

#ifndef VICI_BUILDER_H_
#define VICI_BUILDER_H_

#include "vici_message.h"

typedef struct vici_builder_t vici_builder_t;

/**
 * Build helper for vici message
 */
struct vici_builder_t {

	/**
	 * Append a generic message element to message.
	 *
	 * The additional arguments are type specific, it may be nothing, a string,
	 * a chunk value or both.
	 *
	 * @param type	element type to add
	 * @param ...	additional type specific arguments
	 */
	void (*add)(vici_builder_t *this, vici_type_t type, ...);

	/**
	 * Append a key/value element using a format string.
	 *
	 * Instead of passing the type specific value as a chunk, this method
	 * takes a printf() style format string followed by its arguments. The
	 * key name for a key/value type is still a fixed string.
	 *
	 * @param key	key name of the key/value to add
	 * @param fmt	value format string
	 * @param ...	arguments to value format string
	 */
	void (*add_kv)(vici_builder_t *this, char *key, char *fmt, ...);

	/**
	 * Append a message element using a format string and va_list.
	 *
	 * Instead of passing the type specific value as a chunk, this method
	 * takes a printf() style format string followed by its arguments. The
	 * key name for a key/value type is still a fixed string.
	 *
	 * @param key	key name of the key/value to add
	 * @param fmt	value format string
	 * @param args	arguments to value format string
	 */
	void (*vadd_kv)(vici_builder_t *this, char *key, char *fmt, va_list args);

	/**
	 * Append a list item element using a format string.
	 *
	 * Instead of passing the type specific value as a chunk, this method
	 * takes a printf() style format string followed by its arguments.
	 *
	 * @param fmt	value format string
	 * @param ...	arguments to value format string
	 */
	void (*add_li)(vici_builder_t *this, char *fmt, ...);

	/**
	 * Append a list item element using a format string and va_list.
	 *
	 * Instead of passing the type specific value as a chunk, this method
	 * takes a printf() style format string followed by its arguments.
	 *
	 * @param fmt	value format string
	 * @param args	arguments to value format string
	 */
	void (*vadd_li)(vici_builder_t *this, char *fmt, va_list args);

	/**
	 * Begin a new section.
	 *
	 * @param name	name of section to begin
	 */
	void (*begin_section)(vici_builder_t *this, char *name);

	/**
	 * End the currently open section.
	 */
	void (*end_section)(vici_builder_t *this);

	/**
	 * Begin a new list.
	 *
	 * @param name	name of list to begin
	 */
	void (*begin_list)(vici_builder_t *this, char *name);

	/**
	 * End the currently open list.
	 */
	void (*end_list)(vici_builder_t *this);

	/**
	 * Finalize a vici message with all added elements, destroy builder.
	 *
	 * @return		vici message, NULL on error
	 */
	vici_message_t* (*finalize)(vici_builder_t *this);

	/**
	 * Destroy a vici builder without finalization.
	 *
	 * Note that finalize() already destroys the message, and calling destroy()
	 * is required only if the message does not get finalize()d.
	 */
	void (*destroy)(vici_builder_t *this);
};

/**
 * Create a vici_builder instance.
 */
vici_builder_t *vici_builder_create();

#endif /** VICI_BUILDER_H_ @}*/