schema support int/bool/float

This commit is contained in:
fengzero
2026-08-11 06:46:06 +00:00
parent b2a9ef3940
commit aca0d6cf18
3 changed files with 73 additions and 3 deletions
+28 -3
View File
@@ -49,10 +49,31 @@ static int mqtt_schema_parse(json_t *root, mqtt_schema_vt_t **vts,
str_val[strlen(str_val) - 1] == '}') {
return -1;
} else {
vt->vt = MQTT_SCHEMA_UD;
vt->vt = MQTT_SCHEMA_UD;
vt->jtype = NEU_JSON_STR;
strncpy(vt->ud, str_val, sizeof(vt->ud) - 1);
}
}
} else if (json_is_integer(value) || json_is_real(value) ||
json_is_boolean(value)) {
*vts_len += 1;
*vts = realloc(*vts, *vts_len * sizeof(mqtt_schema_vt_t));
mqtt_schema_vt_t *vt = &(*vts)[*vts_len - 1];
memset(vt, 0, sizeof(mqtt_schema_vt_t));
strncpy(vt->name, key, sizeof(vt->name) - 1);
vt->vt = MQTT_SCHEMA_UD;
if (json_is_integer(value)) {
vt->jtype = NEU_JSON_INT;
vt->jvalue.val_int = json_integer_value(value);
} else if (json_is_real(value)) {
vt->jtype = NEU_JSON_DOUBLE;
vt->jvalue.val_double = json_real_value(value);
} else {
vt->jtype = NEU_JSON_BOOL;
vt->jvalue.val_bool = json_boolean_value(value);
}
} else if (json_is_object(value)) {
if (deep >= 3) {
return -1;
@@ -280,8 +301,12 @@ static void *schema_encode(char *driver, char *group,
break;
}
case MQTT_SCHEMA_UD:
elem.t = NEU_JSON_STR;
elem.v.val_str = vts[i].ud;
elem.t = vts[i].jtype;
if (vts[i].jtype == NEU_JSON_STR) {
elem.v.val_str = vts[i].ud;
} else {
elem.v = vts[i].jvalue;
}
break;
case MQTT_SCHEMA_OBJECT: {
void *sub_root = schema_encode(driver, group, tags, vts[i].sub_vts,
+3
View File
@@ -53,6 +53,9 @@ typedef struct mqtt_schema_vt {
char ud[128];
neu_json_type_e jtype;
neu_json_value_u jvalue;
mqtt_schema_vt_t *sub_vts;
size_t n_sub_vts;
} mqtt_schema_vt_t;
+42
View File
@@ -89,6 +89,48 @@ TEST(validate_deep_success, schema)
free(vts);
}
TEST(validate_constants, schema)
{
const char *schema =
"{\"string\":\"value\",\"integer\":1234,\"float\":11.44,"
"\"boolean\":true,\"object\":{\"integer\":-42,\"float\":0.5,"
"\"boolean\":false}}";
mqtt_schema_vt_t *vts = NULL;
size_t n_vts;
int ret = mqtt_schema_validate(schema, &vts, &n_vts);
ASSERT_EQ(ret, 0);
ASSERT_EQ(n_vts, 5);
EXPECT_EQ(vts[0].jtype, NEU_JSON_STR);
EXPECT_STREQ(vts[0].ud, "value");
EXPECT_EQ(vts[1].jtype, NEU_JSON_INT);
EXPECT_EQ(vts[1].jvalue.val_int, 1234);
EXPECT_EQ(vts[2].jtype, NEU_JSON_DOUBLE);
EXPECT_EQ(vts[2].jvalue.val_double, 11.44);
EXPECT_EQ(vts[3].jtype, NEU_JSON_BOOL);
EXPECT_TRUE(vts[3].jvalue.val_bool);
ASSERT_EQ(vts[4].vt, MQTT_SCHEMA_OBJECT);
ASSERT_EQ(vts[4].n_sub_vts, 3);
EXPECT_EQ(vts[4].sub_vts[0].jvalue.val_int, -42);
EXPECT_EQ(vts[4].sub_vts[1].jvalue.val_double, 0.5);
EXPECT_FALSE(vts[4].sub_vts[2].jvalue.val_bool);
char * result = NULL;
neu_json_read_resp_t tags = { 0 };
ret = mqtt_schema_encode((char *) "driver", (char *) "group", &tags, vts,
n_vts, NULL, 0, &result);
ASSERT_EQ(ret, 0);
EXPECT_STREQ(result,
"{\"string\": \"value\", \"integer\": 1234, \"float\": "
"11.44, \"boolean\": true, \"object\": {\"integer\": -42, "
"\"float\": 0.5, \"boolean\": false}}");
free(result);
free(vts[4].sub_vts);
free(vts);
}
TEST(validate_failed, schema)
{
const char *schema =