Skip to content

Commit e104f44

Browse files
committed
Generate parse_f functions for config structs
Complements the emit_f API we already have.
1 parent e2012e8 commit e104f44

File tree

6 files changed

+209
-6
lines changed

6 files changed

+209
-6
lines changed

include/mgos_config_util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ bool mgos_conf_parse_msg(const struct mg_str json, const char *acl,
103103
bool mgos_conf_parse_sub(const struct mg_str json,
104104
const struct mgos_conf_entry *sub_schema, void *cfg);
105105

106+
bool mgos_conf_parse_sub_f(const char *fname,
107+
const struct mgos_conf_entry *sub_schema,
108+
const void *cfg);
109+
106110
/*
107111
* Callback for `mgos_conf_emit_cb` (see below); `data` is the emitted data and
108112
* `param` is user-defined param given to `mgos_conf_emit_cb`.

src/test/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ CFLAGS = -W -Wall -Wextra -Werror -g -O0 -Wno-multichar -ffunction-sections -Wl,
3434

3535
all: $(BUILD_DIR) diff test
3636

37-
test: $(PROG)
37+
test: diff $(PROG)
3838
./$(PROG)
39-
@{ \
39+
{ \
4040
x=0; \
4141
diff -u data/golden/mgos_config_pretty.json $(BUILD_DIR)/mgos_config_pretty.json || x=1; \
4242
diff -u data/golden/mgos_config.json $(BUILD_DIR)/mgos_config.json || x=1; \
4343
diff -u data/golden/mgos_config_boo_pretty.json $(BUILD_DIR)/mgos_config_boo_pretty.json || x=1; \
4444
diff -u data/golden/mgos_config_test_bar1_pretty.json $(BUILD_DIR)/mgos_config_test_bar1_pretty.json || x=1; \
45-
exit $$x; \
45+
echo $$x; exit $$x; \
4646
}
4747
@echo DIFF PASS
4848

src/test/data/golden/mgos_config.c

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#include <stdbool.h>
1010

11+
#include "common/cs_file.h"
12+
1113
#include "mgos_config_util.h"
1214

1315

@@ -74,6 +76,14 @@ void mgos_config_wifi_sta_set_defaults(struct mgos_config_wifi_sta *cfg) {
7476
cfg->ssid = NULL;
7577
cfg->pass = "so\nmany\nlines\n";
7678
}
79+
bool mgos_config_wifi_sta_parse_f(const char *fname, struct mgos_config_wifi_sta *cfg) {
80+
size_t len;
81+
char *data = cs_read_file(fname, &len);
82+
if (data == NULL) return false;
83+
bool res = mgos_config_wifi_sta_parse(mg_mk_str_n(data, len), cfg);
84+
free(data);
85+
return res;
86+
}
7787

7888
/* struct mgos_config_wifi_ap */
7989
const struct mgos_conf_entry *mgos_config_wifi_ap_get_schema(void) {
@@ -86,6 +96,14 @@ void mgos_config_wifi_ap_set_defaults(struct mgos_config_wifi_ap *cfg) {
8696
cfg->channel = 6;
8797
cfg->dhcp_end = "192.168.4.200";
8898
}
99+
bool mgos_config_wifi_ap_parse_f(const char *fname, struct mgos_config_wifi_ap *cfg) {
100+
size_t len;
101+
char *data = cs_read_file(fname, &len);
102+
if (data == NULL) return false;
103+
bool res = mgos_config_wifi_ap_parse(mg_mk_str_n(data, len), cfg);
104+
free(data);
105+
return res;
106+
}
89107

90108
/* struct mgos_config_wifi */
91109
const struct mgos_conf_entry *mgos_config_wifi_get_schema(void) {
@@ -96,6 +114,14 @@ void mgos_config_wifi_set_defaults(struct mgos_config_wifi *cfg) {
96114
mgos_config_wifi_sta_set_defaults(&cfg->sta);
97115
mgos_config_wifi_ap_set_defaults(&cfg->ap);
98116
}
117+
bool mgos_config_wifi_parse_f(const char *fname, struct mgos_config_wifi *cfg) {
118+
size_t len;
119+
char *data = cs_read_file(fname, &len);
120+
if (data == NULL) return false;
121+
bool res = mgos_config_wifi_parse(mg_mk_str_n(data, len), cfg);
122+
free(data);
123+
return res;
124+
}
99125

100126
/* struct mgos_config_http */
101127
const struct mgos_conf_entry *mgos_config_http_get_schema(void) {
@@ -106,6 +132,14 @@ void mgos_config_http_set_defaults(struct mgos_config_http *cfg) {
106132
cfg->enable = true;
107133
cfg->port = 80;
108134
}
135+
bool mgos_config_http_parse_f(const char *fname, struct mgos_config_http *cfg) {
136+
size_t len;
137+
char *data = cs_read_file(fname, &len);
138+
if (data == NULL) return false;
139+
bool res = mgos_config_http_parse(mg_mk_str_n(data, len), cfg);
140+
free(data);
141+
return res;
142+
}
109143

110144
/* struct mgos_config_debug_empty */
111145
const struct mgos_conf_entry *mgos_config_debug_empty_get_schema(void) {
@@ -115,6 +149,14 @@ const struct mgos_conf_entry *mgos_config_debug_empty_get_schema(void) {
115149
void mgos_config_debug_empty_set_defaults(struct mgos_config_debug_empty *cfg) {
116150
(void) cfg;
117151
}
152+
bool mgos_config_debug_empty_parse_f(const char *fname, struct mgos_config_debug_empty *cfg) {
153+
size_t len;
154+
char *data = cs_read_file(fname, &len);
155+
if (data == NULL) return false;
156+
bool res = mgos_config_debug_empty_parse(mg_mk_str_n(data, len), cfg);
157+
free(data);
158+
return res;
159+
}
118160

119161
/* struct mgos_config_debug */
120162
const struct mgos_conf_entry *mgos_config_debug_get_schema(void) {
@@ -132,6 +174,14 @@ void mgos_config_debug_set_defaults(struct mgos_config_debug *cfg) {
132174
cfg->test_ui = 4294967295;
133175
mgos_config_debug_empty_set_defaults(&cfg->empty);
134176
}
177+
bool mgos_config_debug_parse_f(const char *fname, struct mgos_config_debug *cfg) {
178+
size_t len;
179+
char *data = cs_read_file(fname, &len);
180+
if (data == NULL) return false;
181+
bool res = mgos_config_debug_parse(mg_mk_str_n(data, len), cfg);
182+
free(data);
183+
return res;
184+
}
135185

136186
/* struct mgos_config_baz */
137187
const struct mgos_conf_entry *mgos_config_baz_get_schema(void) {
@@ -141,6 +191,14 @@ const struct mgos_conf_entry *mgos_config_baz_get_schema(void) {
141191
void mgos_config_baz_set_defaults(struct mgos_config_baz *cfg) {
142192
cfg->bazaar = false;
143193
}
194+
bool mgos_config_baz_parse_f(const char *fname, struct mgos_config_baz *cfg) {
195+
size_t len;
196+
char *data = cs_read_file(fname, &len);
197+
if (data == NULL) return false;
198+
bool res = mgos_config_baz_parse(mg_mk_str_n(data, len), cfg);
199+
free(data);
200+
return res;
201+
}
144202

145203
/* struct mgos_config_bar_inner */
146204
const struct mgos_conf_entry *mgos_config_bar_inner_get_schema(void) {
@@ -151,6 +209,14 @@ void mgos_config_bar_inner_set_defaults(struct mgos_config_bar_inner *cfg) {
151209
cfg->param2 = "p2";
152210
cfg->param3 = 3333;
153211
}
212+
bool mgos_config_bar_inner_parse_f(const char *fname, struct mgos_config_bar_inner *cfg) {
213+
size_t len;
214+
char *data = cs_read_file(fname, &len);
215+
if (data == NULL) return false;
216+
bool res = mgos_config_bar_inner_parse(mg_mk_str_n(data, len), cfg);
217+
free(data);
218+
return res;
219+
}
154220

155221
/* struct mgos_config_baz */
156222
const struct mgos_conf_entry *mgos_config_bar_baz_get_schema(void) {
@@ -160,6 +226,14 @@ const struct mgos_conf_entry *mgos_config_bar_baz_get_schema(void) {
160226
void mgos_config_bar_baz_set_defaults(struct mgos_config_baz *cfg) {
161227
cfg->bazaar = false;
162228
}
229+
bool mgos_config_bar_baz_parse_f(const char *fname, struct mgos_config_baz *cfg) {
230+
size_t len;
231+
char *data = cs_read_file(fname, &len);
232+
if (data == NULL) return false;
233+
bool res = mgos_config_bar_baz_parse(mg_mk_str_n(data, len), cfg);
234+
free(data);
235+
return res;
236+
}
163237

164238
/* struct mgos_config_bar */
165239
const struct mgos_conf_entry *mgos_config_bar_get_schema(void) {
@@ -172,6 +246,14 @@ void mgos_config_bar_set_defaults(struct mgos_config_bar *cfg) {
172246
mgos_config_bar_inner_set_defaults(&cfg->inner);
173247
mgos_config_bar_baz_set_defaults(&cfg->baz);
174248
}
249+
bool mgos_config_bar_parse_f(const char *fname, struct mgos_config_bar *cfg) {
250+
size_t len;
251+
char *data = cs_read_file(fname, &len);
252+
if (data == NULL) return false;
253+
bool res = mgos_config_bar_parse(mg_mk_str_n(data, len), cfg);
254+
free(data);
255+
return res;
256+
}
175257

176258
/* struct mgos_config_bar_inner */
177259
const struct mgos_conf_entry *mgos_config_test_bar1_inner_get_schema(void) {
@@ -182,6 +264,14 @@ void mgos_config_test_bar1_inner_set_defaults(struct mgos_config_bar_inner *cfg)
182264
cfg->param2 = "p2";
183265
cfg->param3 = 3333;
184266
}
267+
bool mgos_config_test_bar1_inner_parse_f(const char *fname, struct mgos_config_bar_inner *cfg) {
268+
size_t len;
269+
char *data = cs_read_file(fname, &len);
270+
if (data == NULL) return false;
271+
bool res = mgos_config_test_bar1_inner_parse(mg_mk_str_n(data, len), cfg);
272+
free(data);
273+
return res;
274+
}
185275

186276
/* struct mgos_config_baz */
187277
const struct mgos_conf_entry *mgos_config_test_bar1_baz_get_schema(void) {
@@ -191,6 +281,14 @@ const struct mgos_conf_entry *mgos_config_test_bar1_baz_get_schema(void) {
191281
void mgos_config_test_bar1_baz_set_defaults(struct mgos_config_baz *cfg) {
192282
cfg->bazaar = false;
193283
}
284+
bool mgos_config_test_bar1_baz_parse_f(const char *fname, struct mgos_config_baz *cfg) {
285+
size_t len;
286+
char *data = cs_read_file(fname, &len);
287+
if (data == NULL) return false;
288+
bool res = mgos_config_test_bar1_baz_parse(mg_mk_str_n(data, len), cfg);
289+
free(data);
290+
return res;
291+
}
194292

195293
/* struct mgos_config_bar */
196294
const struct mgos_conf_entry *mgos_config_test_bar1_get_schema(void) {
@@ -203,6 +301,14 @@ void mgos_config_test_bar1_set_defaults(struct mgos_config_bar *cfg) {
203301
mgos_config_test_bar1_inner_set_defaults(&cfg->inner);
204302
mgos_config_test_bar1_baz_set_defaults(&cfg->baz);
205303
}
304+
bool mgos_config_test_bar1_parse_f(const char *fname, struct mgos_config_bar *cfg) {
305+
size_t len;
306+
char *data = cs_read_file(fname, &len);
307+
if (data == NULL) return false;
308+
bool res = mgos_config_test_bar1_parse(mg_mk_str_n(data, len), cfg);
309+
free(data);
310+
return res;
311+
}
206312

207313
/* struct mgos_config_bar_inner */
208314
const struct mgos_conf_entry *mgos_config_test_bar2_inner_get_schema(void) {
@@ -213,6 +319,14 @@ void mgos_config_test_bar2_inner_set_defaults(struct mgos_config_bar_inner *cfg)
213319
cfg->param2 = "p2";
214320
cfg->param3 = 3333;
215321
}
322+
bool mgos_config_test_bar2_inner_parse_f(const char *fname, struct mgos_config_bar_inner *cfg) {
323+
size_t len;
324+
char *data = cs_read_file(fname, &len);
325+
if (data == NULL) return false;
326+
bool res = mgos_config_test_bar2_inner_parse(mg_mk_str_n(data, len), cfg);
327+
free(data);
328+
return res;
329+
}
216330

217331
/* struct mgos_config_baz */
218332
const struct mgos_conf_entry *mgos_config_test_bar2_baz_get_schema(void) {
@@ -222,6 +336,14 @@ const struct mgos_conf_entry *mgos_config_test_bar2_baz_get_schema(void) {
222336
void mgos_config_test_bar2_baz_set_defaults(struct mgos_config_baz *cfg) {
223337
cfg->bazaar = true;
224338
}
339+
bool mgos_config_test_bar2_baz_parse_f(const char *fname, struct mgos_config_baz *cfg) {
340+
size_t len;
341+
char *data = cs_read_file(fname, &len);
342+
if (data == NULL) return false;
343+
bool res = mgos_config_test_bar2_baz_parse(mg_mk_str_n(data, len), cfg);
344+
free(data);
345+
return res;
346+
}
225347

226348
/* struct mgos_config_bar */
227349
const struct mgos_conf_entry *mgos_config_test_bar2_get_schema(void) {
@@ -234,6 +356,14 @@ void mgos_config_test_bar2_set_defaults(struct mgos_config_bar *cfg) {
234356
mgos_config_test_bar2_inner_set_defaults(&cfg->inner);
235357
mgos_config_test_bar2_baz_set_defaults(&cfg->baz);
236358
}
359+
bool mgos_config_test_bar2_parse_f(const char *fname, struct mgos_config_bar *cfg) {
360+
size_t len;
361+
char *data = cs_read_file(fname, &len);
362+
if (data == NULL) return false;
363+
bool res = mgos_config_test_bar2_parse(mg_mk_str_n(data, len), cfg);
364+
free(data);
365+
return res;
366+
}
237367

238368
/* struct mgos_config_test */
239369
const struct mgos_conf_entry *mgos_config_test_get_schema(void) {
@@ -244,6 +374,14 @@ void mgos_config_test_set_defaults(struct mgos_config_test *cfg) {
244374
mgos_config_test_bar1_set_defaults(&cfg->bar1);
245375
mgos_config_test_bar2_set_defaults(&cfg->bar2);
246376
}
377+
bool mgos_config_test_parse_f(const char *fname, struct mgos_config_test *cfg) {
378+
size_t len;
379+
char *data = cs_read_file(fname, &len);
380+
if (data == NULL) return false;
381+
bool res = mgos_config_test_parse(mg_mk_str_n(data, len), cfg);
382+
free(data);
383+
return res;
384+
}
247385

248386
/* struct mgos_config_boo_sub */
249387
const struct mgos_conf_entry *mgos_config_boo_sub_get_schema(void) {
@@ -253,6 +391,14 @@ const struct mgos_conf_entry *mgos_config_boo_sub_get_schema(void) {
253391
void mgos_config_boo_sub_set_defaults(struct mgos_config_boo_sub *cfg) {
254392
cfg->param7 = 444;
255393
}
394+
bool mgos_config_boo_sub_parse_f(const char *fname, struct mgos_config_boo_sub *cfg) {
395+
size_t len;
396+
char *data = cs_read_file(fname, &len);
397+
if (data == NULL) return false;
398+
bool res = mgos_config_boo_sub_parse(mg_mk_str_n(data, len), cfg);
399+
free(data);
400+
return res;
401+
}
256402

257403
/* struct mgos_config_boo */
258404
const struct mgos_conf_entry *mgos_config_boo_get_schema(void) {
@@ -264,6 +410,14 @@ void mgos_config_boo_set_defaults(struct mgos_config_boo *cfg) {
264410
cfg->param6 = "p6";
265411
mgos_config_boo_sub_set_defaults(&cfg->sub);
266412
}
413+
bool mgos_config_boo_parse_f(const char *fname, struct mgos_config_boo *cfg) {
414+
size_t len;
415+
char *data = cs_read_file(fname, &len);
416+
if (data == NULL) return false;
417+
bool res = mgos_config_boo_parse(mg_mk_str_n(data, len), cfg);
418+
free(data);
419+
return res;
420+
}
267421

268422
/* struct mgos_config */
269423
const struct mgos_conf_entry *mgos_config_get_schema(void) {
@@ -277,6 +431,14 @@ void mgos_config_set_defaults(struct mgos_config *cfg) {
277431
mgos_config_debug_set_defaults(&cfg->debug);
278432
mgos_config_test_set_defaults(&cfg->test);
279433
}
434+
bool mgos_config_parse_f(const char *fname, struct mgos_config *cfg) {
435+
size_t len;
436+
char *data = cs_read_file(fname, &len);
437+
if (data == NULL) return false;
438+
bool res = mgos_config_parse(mg_mk_str_n(data, len), cfg);
439+
free(data);
440+
return res;
441+
}
280442

281443
/* Global instance */
282444
struct mgos_config mgos_sys_config;

0 commit comments

Comments
 (0)