Line data Source code
1 : /* Macros for extracting config values out of a pod */
2 :
3 : #define CFG_POP( type, cfg_path ) \
4 2064 : do { \
5 2064 : char const * key = #cfg_path; \
6 2064 : fd_pod_info_t info[1]; \
7 2064 : if( fd_pod_query( pod, key, info ) ) break; \
8 2064 : if( FD_UNLIKELY( !fdctl_cfg_get_##type( &config->cfg_path, sizeof(config->cfg_path), \
9 432 : info, key ) ) ) \
10 432 : return NULL; \
11 432 : fd_pod_remove( pod, key ); \
12 432 : } while(0)
13 :
14 : #define CFG_POP1( type, toml_path, cfg_path ) \
15 60 : do { \
16 60 : char const * key = #toml_path; \
17 60 : fd_pod_info_t info[1]; \
18 60 : if( fd_pod_query( pod, key, info ) ) break; \
19 60 : if( FD_UNLIKELY( !fdctl_cfg_get_##type( &config->cfg_path, sizeof(config->cfg_path), \
20 15 : info, key ) ) ) \
21 15 : return NULL; \
22 15 : fd_pod_remove( pod, key ); \
23 15 : } while(0)
24 :
25 : #define CFG_POP_ARRAY( type, cfg_path ) \
26 108 : do { \
27 108 : char const * key = #cfg_path; \
28 108 : fd_pod_info_t info[1]; \
29 108 : if( fd_pod_query( pod, key, info ) ) break; \
30 108 : if( FD_UNLIKELY( info->val_type!=FD_POD_VAL_TYPE_SUBPOD ) ) { \
31 0 : FD_LOG_WARNING(( "`%s`: expected array", key )); \
32 0 : return NULL; \
33 0 : } \
34 30 : ulong arr_len = sizeof( config->cfg_path ) / sizeof( config->cfg_path[ 0 ] ); \
35 30 : ulong j = 0UL; \
36 36 : for( fd_pod_iter_t iter = fd_pod_iter_init( info->val ); !fd_pod_iter_done( iter ); iter = fd_pod_iter_next( iter ) ) { \
37 6 : if( FD_UNLIKELY( j>=arr_len ) ) { \
38 0 : FD_LOG_WARNING(( "`%s`: too many values (max %lu)", key, arr_len )); \
39 0 : return NULL; \
40 0 : } \
41 6 : fd_pod_info_t sub_info = fd_pod_iter_info( iter ); \
42 6 : fdctl_cfg_get_##type( &config->cfg_path[j], sizeof(config->cfg_path[j]), &sub_info, key ); \
43 6 : j++; \
44 6 : } \
45 30 : config->cfg_path ## _cnt = j; \
46 30 : fd_pod_remove( pod, key ); \
47 30 : } while(0)
48 :
49 : #define CFG_POP1_ARRAY( type, toml_path, cfg_path ) \
50 12 : do { \
51 12 : char const * key = #toml_path; \
52 12 : fd_pod_info_t info[1]; \
53 12 : if( fd_pod_query( pod, key, info ) ) break; \
54 12 : if( FD_UNLIKELY( info->val_type!=FD_POD_VAL_TYPE_SUBPOD ) ) { \
55 0 : FD_LOG_WARNING(( "`%s`: expected array", key )); \
56 0 : return NULL; \
57 0 : } \
58 3 : ulong arr_len = sizeof( config->cfg_path ) / sizeof( config->cfg_path[ 0 ] ); \
59 3 : ulong j = 0UL; \
60 3 : for( fd_pod_iter_t iter = fd_pod_iter_init( info->val ); !fd_pod_iter_done( iter ); iter = fd_pod_iter_next( iter ) ) { \
61 0 : if( FD_UNLIKELY( j>=arr_len ) ) { \
62 0 : FD_LOG_WARNING(( "`%s`: too many values (max %lu)", key, arr_len )); \
63 0 : return NULL; \
64 0 : } \
65 0 : fd_pod_info_t sub_info = fd_pod_iter_info( iter ); \
66 0 : fdctl_cfg_get_##type( &config->cfg_path[j], sizeof(config->cfg_path[j]), &sub_info, key ); \
67 0 : j++; \
68 0 : } \
69 3 : config->cfg_path ## _cnt = j; \
70 3 : fd_pod_remove( pod, key ); \
71 3 : } while(0)
72 :
73 : #define CFG_POP_TABLE( type, toml_path, cfg_path, cfg_field, field_idx ) \
74 : do { \
75 : char const * key = #toml_path; \
76 : fd_pod_info_t info[1]; \
77 : if( fd_pod_query( pod, key, info ) ) break; \
78 : if( FD_UNLIKELY( info->val_type!=FD_POD_VAL_TYPE_SUBPOD ) ) { \
79 : FD_LOG_WARNING(( "`%s`: expected table", key )); \
80 : return NULL; \
81 : } \
82 : ulong table_len = fd_pod_cnt( info->val ); \
83 : ulong j = 0UL; \
84 : for( fd_pod_iter_t iter = fd_pod_iter_init( info->val ); !fd_pod_iter_done( iter ); iter = fd_pod_iter_next( iter ) ) { \
85 : if( FD_UNLIKELY( j>=table_len ) ) { \
86 : FD_LOG_WARNING(( "`%s`: too many values (max %lu)", key, table_len )); \
87 : return NULL; \
88 : } \
89 : fd_pod_info_t sub_info = fd_pod_iter_info( iter ); \
90 : if( FD_UNLIKELY( sub_info.val_type!=FD_POD_VAL_TYPE_SUBPOD ) ) continue; \
91 : fd_pod_info_t list[ 256UL ]; \
92 : ulong fields_cnt = fd_pod_cnt( sub_info.val ); \
93 : if( FD_UNLIKELY( fields_cnt>256UL ) ) { \
94 : FD_LOG_WARNING(( "`%s`: Too many subpods (%lu) in table", sub_info.key, fields_cnt )); \
95 : return NULL; \
96 : } \
97 : fd_pod_info_t * fields = fd_pod_list( sub_info.val, list ); \
98 : FD_TEST( field_idx<fields_cnt ); \
99 : fd_pod_info_t field_info = fields[ field_idx ]; \
100 : char table_toml_path[ PATH_MAX ]; \
101 : char const * cfg_field_str = #cfg_field; \
102 : FD_TEST( fd_cstr_printf_check( table_toml_path, PATH_MAX, NULL, "%s.%lu.%s", key, j, cfg_field_str ) ); \
103 : fdctl_cfg_get_##type( &config->cfg_path[j].cfg_field, sizeof(config->cfg_path[j].cfg_field), &field_info, table_toml_path ); \
104 : j++; \
105 : } \
106 : config->cfg_path ## _cnt = j; \
107 : } while(0)
108 :
109 : #define CFG_POP_TABLE_FINI( toml_path ) \
110 : do { \
111 : fd_pod_remove( pod, #toml_path ); \
112 : } while(0)
|