Skip to content

Commit 2663529

Browse files
committed
app-parser-generator: extract AppObjectGenerator base class
Signed-off-by: Balazs Scheidler <balazs.scheidler@axoflow.com>
1 parent cd1b58b commit 2663529

File tree

1 file changed

+159
-117
lines changed

1 file changed

+159
-117
lines changed

modules/appmodel/app-parser-generator.c

+159-117
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,157 @@
2727

2828
#include <string.h>
2929

30-
typedef struct _AppParserGenerator
30+
typedef struct _AppObjectGenerator AppObjectGenerator;
31+
32+
struct _AppObjectGenerator
3133
{
3234
CfgBlockGenerator super;
33-
GString *block;
34-
const gchar *topic;
35+
gboolean (*parse_arguments)(AppObjectGenerator *self, CfgArgs *args, const gchar *reference);
36+
void (*generate_config)(AppObjectGenerator *self, GlobalConfig *cfg, GString *result);
3537
const gchar *included_apps;
3638
const gchar *excluded_apps;
3739
gboolean is_parsing_enabled;
40+
};
41+
42+
static gboolean
43+
_is_application_included(AppObjectGenerator *self, const gchar *app_name)
44+
{
45+
/* include everything if we don't have the option */
46+
if (!self->included_apps)
47+
return TRUE;
48+
return strstr(self->included_apps, app_name) != NULL;
49+
}
50+
51+
static gboolean
52+
_is_application_excluded(AppObjectGenerator *self, const gchar *app_name)
53+
{
54+
if (!self->excluded_apps)
55+
return FALSE;
56+
return strstr(self->excluded_apps, app_name) != NULL;
57+
}
58+
59+
static gboolean
60+
_parse_auto_parse_arg(AppObjectGenerator *self, CfgArgs *args, const gchar *reference)
61+
{
62+
const gchar *v = cfg_args_get(args, "auto-parse");
63+
64+
if (v)
65+
self->is_parsing_enabled = cfg_process_yesno(v);
66+
else
67+
self->is_parsing_enabled = TRUE;
68+
return TRUE;
69+
}
70+
71+
static gboolean
72+
_parse_auto_parse_exclude_arg(AppObjectGenerator *self, CfgArgs *args, const gchar *reference)
73+
{
74+
const gchar *v = cfg_args_get(args, "auto-parse-exclude");
75+
if (!v)
76+
return TRUE;
77+
self->excluded_apps = g_strdup(v);
78+
return TRUE;
79+
}
80+
81+
static gboolean
82+
_parse_auto_parse_include_arg(AppObjectGenerator *self, CfgArgs *args, const gchar *reference)
83+
{
84+
const gchar *v = cfg_args_get(args, "auto-parse-include");
85+
if (!v)
86+
return TRUE;
87+
self->included_apps = g_strdup(v);
88+
return TRUE;
89+
}
90+
91+
92+
static gboolean
93+
app_object_generator_parse_arguments_method(AppObjectGenerator *self, CfgArgs *args, const gchar *reference)
94+
{
95+
g_assert(args != NULL);
96+
97+
if (!_parse_auto_parse_arg(self, args, reference))
98+
return FALSE;
99+
if (!_parse_auto_parse_exclude_arg(self, args, reference))
100+
return FALSE;
101+
if (!_parse_auto_parse_include_arg(self, args, reference))
102+
return FALSE;
103+
return TRUE;
104+
}
105+
106+
static gboolean
107+
_generate(CfgBlockGenerator *s, GlobalConfig *cfg, gpointer args, GString *result, const gchar *reference)
108+
{
109+
AppObjectGenerator *self = (AppObjectGenerator *) s;
110+
CfgArgs *cfgargs = (CfgArgs *)args;
111+
112+
if (!self->parse_arguments(self, cfgargs, reference))
113+
return FALSE;
114+
115+
self->generate_config(self, cfg, result);
116+
117+
return TRUE;
118+
}
119+
120+
void
121+
app_object_generator_init_instance(AppObjectGenerator *self, gint context, const gchar *name)
122+
{
123+
cfg_block_generator_init_instance(&self->super, context, name);
124+
self->super.generate = _generate;
125+
self->parse_arguments = app_object_generator_parse_arguments_method;
126+
}
127+
128+
/* app-parser() */
129+
130+
typedef struct _AppParserGenerator
131+
{
132+
AppObjectGenerator super;
133+
const gchar *topic;
134+
GString *block;
38135
gboolean first_app_generated;
39136
gboolean allow_overlaps;
40137
} AppParserGenerator;
41138

139+
static gboolean
140+
_parse_topic_arg(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
141+
{
142+
self->topic = cfg_args_get(args, "topic");
143+
if (!self->topic)
144+
{
145+
msg_error("app-parser() requires a topic() argument",
146+
evt_tag_str("reference", reference));
147+
return FALSE;
148+
}
149+
return TRUE;
150+
}
151+
152+
static gboolean
153+
_parse_allow_overlaps(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
154+
{
155+
const gchar *v = cfg_args_get(args, "allow-overlaps");
156+
if (v)
157+
self->allow_overlaps = cfg_process_yesno(v);
158+
else
159+
self->allow_overlaps = FALSE;
160+
return TRUE;
161+
}
162+
163+
static gboolean
164+
app_parser_generator_parse_arguments(AppObjectGenerator *s, CfgArgs *args, const gchar *reference)
165+
{
166+
AppParserGenerator *self = (AppParserGenerator *) s;
167+
g_assert(args != NULL);
168+
169+
if (!_parse_topic_arg(self, args, reference))
170+
return FALSE;
171+
172+
if (!_parse_allow_overlaps(self, args, reference))
173+
return FALSE;
174+
175+
if (!app_object_generator_parse_arguments_method(&self->super, args, reference))
176+
return FALSE;
177+
178+
return TRUE;
179+
}
180+
42181
static void
43182
_generate_filter(AppParserGenerator *self, const gchar *filter_expr)
44183
{
@@ -73,36 +212,18 @@ _generate_action(AppParserGenerator *self, Application *app)
73212
}
74213
}
75214

76-
static gboolean
77-
_is_application_included(AppParserGenerator *self, Application *app)
78-
{
79-
/* include everything if we don't have the option */
80-
if (!self->included_apps)
81-
return TRUE;
82-
return strstr(self->included_apps, app->super.name) != NULL;
83-
}
84-
85-
static gboolean
86-
_is_application_excluded(AppParserGenerator *self, Application *app)
87-
{
88-
if (!self->excluded_apps)
89-
return FALSE;
90-
return strstr(self->excluded_apps, app->super.name) != NULL;
91-
}
92-
93215
static void
94-
_generate_application(AppModelObject *object, gpointer user_data)
216+
_generate_application(Application *app, gpointer user_data)
95217
{
96-
Application *app = (Application *) object;
97218
AppParserGenerator *self = (AppParserGenerator *) user_data;
98219

99220
if (strcmp(self->topic, app->super.instance) != 0)
100221
return;
101222

102-
if (!_is_application_included(self, app))
223+
if (!_is_application_included(&self->super, app->super.name))
103224
return;
104225

105-
if (_is_application_excluded(self, app))
226+
if (_is_application_excluded(&self->super, app->super.name))
106227
return;
107228

108229
if (self->first_app_generated)
@@ -133,21 +254,21 @@ _generate_application(AppModelObject *object, gpointer user_data)
133254
}
134255

135256
static void
136-
_generate_applications(AppParserGenerator *self, AppModelContext *appmodel)
257+
_generate_applications(AppParserGenerator *self, GlobalConfig *cfg)
137258
{
138-
appmodel_context_iter_objects(appmodel, APPLICATION_TYPE_NAME, _generate_application, self);
259+
appmodel_iter_applications(cfg, _generate_application, self);
139260
}
140261

141262
static void
142-
_generate_framing(AppParserGenerator *self, AppModelContext *appmodel)
263+
_generate_framing(AppParserGenerator *self, GlobalConfig *cfg)
143264
{
144265
g_string_append(self->block,
145266
"\nchannel {\n");
146267

147268
self->first_app_generated = FALSE;
148269
if (!self->allow_overlaps)
149270
{
150-
_generate_applications(self, appmodel);
271+
_generate_applications(self, cfg);
151272
if (self->first_app_generated)
152273
g_string_append(self->block, " else {\n");
153274
else
@@ -159,7 +280,7 @@ _generate_framing(AppParserGenerator *self, AppModelContext *appmodel)
159280
}
160281
else
161282
{
162-
_generate_applications(self, appmodel);
283+
_generate_applications(self, cfg);
163284
if (self->first_app_generated)
164285
g_string_append(self->block, " ;\n");
165286
}
@@ -172,106 +293,27 @@ _generate_empty_frame(AppParserGenerator *self)
172293
g_string_append(self->block, "channel { filter { tags('.app.doesnotexist'); }; };");
173294
}
174295

175-
static gboolean
176-
_parse_auto_parse_arg(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
177-
{
178-
const gchar *v = cfg_args_get(args, "auto-parse");
179-
180-
if (v)
181-
self->is_parsing_enabled = cfg_process_yesno(v);
182-
else
183-
self->is_parsing_enabled = TRUE;
184-
return TRUE;
185-
}
186-
187-
static gboolean
188-
_parse_auto_parse_exclude_arg(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
189-
{
190-
const gchar *v = cfg_args_get(args, "auto-parse-exclude");
191-
if (!v)
192-
return TRUE;
193-
self->excluded_apps = g_strdup(v);
194-
return TRUE;
195-
}
196-
197-
static gboolean
198-
_parse_auto_parse_include_arg(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
199-
{
200-
const gchar *v = cfg_args_get(args, "auto-parse-include");
201-
if (!v)
202-
return TRUE;
203-
self->included_apps = g_strdup(v);
204-
return TRUE;
205-
}
206-
207-
static gboolean
208-
_parse_topic_arg(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
209-
{
210-
self->topic = cfg_args_get(args, "topic");
211-
if (!self->topic)
212-
{
213-
msg_error("app-parser() requires a topic() argument",
214-
evt_tag_str("reference", reference));
215-
return FALSE;
216-
}
217-
return TRUE;
218-
}
219-
220-
static gboolean
221-
_parse_allow_overlaps(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
222-
{
223-
const gchar *v = cfg_args_get(args, "allow-overlaps");
224-
if (v)
225-
self->allow_overlaps = cfg_process_yesno(v);
226-
else
227-
self->allow_overlaps = FALSE;
228-
return TRUE;
229-
}
230-
231-
static gboolean
232-
_parse_arguments(AppParserGenerator *self, CfgArgs *args, const gchar *reference)
233-
{
234-
g_assert(args != NULL);
235-
236-
if (!_parse_topic_arg(self, args, reference))
237-
return FALSE;
238-
if (!_parse_auto_parse_arg(self, args, reference))
239-
return FALSE;
240-
if (!_parse_auto_parse_exclude_arg(self, args, reference))
241-
return FALSE;
242-
if (!_parse_auto_parse_include_arg(self, args, reference))
243-
return FALSE;
244-
if (!_parse_allow_overlaps(self, args, reference))
245-
return FALSE;
246-
return TRUE;
247-
}
248-
249-
static gboolean
250-
_generate(CfgBlockGenerator *s, GlobalConfig *cfg, gpointer args, GString *result, const gchar *reference)
296+
void
297+
app_parser_generate_config(AppObjectGenerator *s, GlobalConfig *cfg, GString *result)
251298
{
252299
AppParserGenerator *self = (AppParserGenerator *) s;
253-
AppModelContext *appmodel = appmodel_get_context(cfg);
254-
CfgArgs *cfgargs = (CfgArgs *)args;
255-
256-
if (!_parse_arguments(self, cfgargs, reference))
257-
return FALSE;
258300

259301
self->block = result;
260-
if (self->is_parsing_enabled)
261-
_generate_framing(self, appmodel);
302+
if (self->super.is_parsing_enabled)
303+
_generate_framing(self, cfg);
262304
else
263305
_generate_empty_frame(self);
264306
self->block = NULL;
265-
266-
return TRUE;
267307
}
268308

309+
269310
CfgBlockGenerator *
270311
app_parser_generator_new(gint context, const gchar *name)
271312
{
272313
AppParserGenerator *self = g_new0(AppParserGenerator, 1);
273314

274-
cfg_block_generator_init_instance(&self->super, context, name);
275-
self->super.generate = _generate;
276-
return &self->super;
315+
app_object_generator_init_instance(&self->super, context, name);
316+
self->super.parse_arguments = app_parser_generator_parse_arguments;
317+
self->super.generate_config = app_parser_generate_config;
318+
return &self->super.super;
277319
}

0 commit comments

Comments
 (0)