master
c 90 lines 3.2 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "contexts_options.h"
4
5 static struct {
6 const char *name;
7 uint32_t hash;
8 CONTEXTS_OPTIONS value;
9 } contexts_options[] = {
10 {"minify" , 0 , CONTEXTS_OPTION_MINIFY}
11 , {"debug" , 0 , CONTEXTS_OPTION_DEBUG}
12 , {"config" , 0 , CONTEXTS_OPTION_CONFIGURATIONS}
13 , {"instances" , 0 , CONTEXTS_OPTION_INSTANCES}
14 , {"values" , 0 , CONTEXTS_OPTION_VALUES}
15 , {"summary" , 0 , CONTEXTS_OPTION_SUMMARY}
16 , {"mcp" , 0 , CONTEXTS_OPTION_MCP}
17 , {"dimensions" , 0 , CONTEXTS_OPTION_DIMENSIONS}
18 , {"labels" , 0 , CONTEXTS_OPTION_LABELS}
19 , {"priorities" , 0 , CONTEXTS_OPTION_PRIORITIES}
20 , {"titles" , 0 , CONTEXTS_OPTION_TITLES}
21 , {"retention" , 0 , CONTEXTS_OPTION_RETENTION}
22 , {"liveness" , 0 , CONTEXTS_OPTION_LIVENESS}
23 , {"family" , 0 , CONTEXTS_OPTION_FAMILY}
24 , {"units" , 0 , CONTEXTS_OPTION_UNITS}
25 , {"rfc3339" , 0 , CONTEXTS_OPTION_RFC3339}
26 , {"long-json-keys" , 0 , CONTEXTS_OPTION_JSON_LONG_KEYS}
27 , {"long-keys" , 0 , CONTEXTS_OPTION_JSON_LONG_KEYS}
28 , {NULL , 0 , 0}
29 };
30
31 CONTEXTS_OPTIONS contexts_options_str_to_id(char *o) {
32 CONTEXTS_OPTIONS ret = 0;
33 char *tok;
34
35 while(o && *o && (tok = strsep_skip_consecutive_separators(&o, ", |"))) {
36 if(!*tok) continue;
37
38 uint32_t hash = simple_hash(tok);
39 int i;
40 for(i = 0; contexts_options[i].name ; i++) {
41 if (unlikely(hash == contexts_options[i].hash && !strcmp(tok, contexts_options[i].name))) {
42 ret |= contexts_options[i].value;
43 break;
44 }
45 }
46 }
47
48 return ret;
49 }
50
51 void contexts_options_to_buffer_json_array(BUFFER *wb, const char *key, CONTEXTS_OPTIONS options) {
52 buffer_json_member_add_array(wb, key);
53
54 CONTEXTS_OPTIONS used = 0; // to prevent adding duplicates
55 for(int i = 0; contexts_options[i].name ; i++) {
56 if (unlikely((contexts_options[i].value & options) && !(contexts_options[i].value & used))) {
57 const char *name = contexts_options[i].name;
58 used |= contexts_options[i].value;
59
60 buffer_json_add_array_item_string(wb, name);
61 }
62 }
63
64 buffer_json_array_close(wb);
65 }
66
67 void contexts_options_init(void) {
68 for(size_t i = 0; contexts_options[i].name ; i++)
69 contexts_options[i].hash = simple_hash(contexts_options[i].name);
70 }
71
72 // Map RRDR_OPTIONS to CONTEXTS_OPTIONS for options that are common between both
73 ALWAYS_INLINE
74 CONTEXTS_OPTIONS rrdr_options_to_contexts_options(RRDR_OPTIONS rrdr_options) {
75 CONTEXTS_OPTIONS contexts_options = 0;
76
77 if(rrdr_options & RRDR_OPTION_MINIFY)
78 contexts_options |= CONTEXTS_OPTION_MINIFY;
79
80 if(rrdr_options & RRDR_OPTION_DEBUG)
81 contexts_options |= CONTEXTS_OPTION_DEBUG;
82
83 if(rrdr_options & RRDR_OPTION_RFC3339)
84 contexts_options |= CONTEXTS_OPTION_RFC3339;
85
86 if(rrdr_options & RRDR_OPTION_LONG_JSON_KEYS)
87 contexts_options |= CONTEXTS_OPTION_JSON_LONG_KEYS;
88
89 return contexts_options;
90 }