// Helper to construct the list of field defs static std::unordered_map<w_string, w_query_field_renderer> build_defs() { struct { const char* name; json_ref (*make)(const struct watchman_rule_match* match); } defs[] = { {"name", make_name}, {"symlink_target", make_symlink}, {"exists", make_exists}, {"size", make_size}, {"mode", make_mode}, {"uid", make_uid}, {"gid", make_gid}, MAKE_TIME_FIELD_DEFS(a), MAKE_TIME_FIELD_DEFS(m), MAKE_TIME_FIELD_DEFS(c), {"ino", make_ino}, {"dev", make_dev}, {"nlink", make_nlink}, {"new", make_new}, {"oclock", make_oclock}, {"cclock", make_cclock}, {"type", make_type_field}, }; std::unordered_map<w_string, w_query_field_renderer> map; for (auto& def : defs) { w_string name(def.name, W_STRING_UNICODE); map.emplace(name, w_query_field_renderer{name, def.make}); } return map; }
{ #type "time_ms", make_##type##time_ms }, \ { #type "time_us", make_##type##time_us }, \ { #type "time_ns", make_##type##time_ns }, \ { #type "time_f", make_##type##time_f } static struct w_query_field_renderer { const char *name; json_t *(*make)(struct watchman_rule_match *match); } field_defs[] = { { "name", make_name }, { "exists", make_exists }, { "size", make_size }, { "mode", make_mode }, { "uid", make_uid }, { "gid", make_gid }, MAKE_TIME_FIELD_DEFS(a), MAKE_TIME_FIELD_DEFS(m), MAKE_TIME_FIELD_DEFS(c), { "ino", make_ino }, { "dev", make_dev }, { "nlink", make_nlink }, { "new", make_new }, { "oclock", make_oclock }, { "cclock", make_cclock }, { NULL, NULL } }; json_t *w_query_results_to_json( struct w_query_field_list *field_list, uint32_t num_results, struct watchman_rule_match *results)