static gboolean router_rule_match (RouterRule *rule, JsonObject *object) { RouterMatch *match; const gchar *value; JsonNode *node; guint i; for (i = 0; rule->matches && rule->matches[i].name != NULL; i++) { match = &rule->matches[i]; if (match->glob) { if (!cockpit_json_get_string (object, match->name, NULL, &value) || !value || !g_pattern_match (match->glob, strlen (value), value, NULL)) return FALSE; } else if (match->node) { node = json_object_get_member (object, match->name); if (!node || !cockpit_json_equal (match->node, node)) return FALSE; } else { if (!json_object_has_member (object, match->name)) return FALSE; } } return TRUE; }
void _cockpit_assert_json_eq_msg (const char *domain, const char *file, int line, const char *func, JsonObject *object, const gchar *expect) { GError *error = NULL; JsonNode *node; JsonNode *exnode; gchar *escaped; gchar *msg; node = json_node_init_object (json_node_alloc (), object); exnode = cockpit_json_parse (expect, -1, &error); if (error) g_assertion_message_error (domain, file, line, func, "error", error, 0, 0); g_assert (exnode); if (!cockpit_json_equal (exnode, node)) { escaped = cockpit_json_write (node, NULL); msg = g_strdup_printf ("%s != %s", escaped, expect); g_assertion_message (domain, file, line, func, msg); g_free (escaped); g_free (msg); } json_node_free (node); json_node_free (exnode); }