commit d2ede0a6318f5ae822e25febc18244499be4a4d2
parent 0bbc8f9cae704f4f1ff832d6adb84ca2075a1b78
Author: William Casarin <jb55@jb55.com>
Date: Thu, 10 Aug 2023 12:53:37 -0700
schema: add flatcc json parser for profiles
Diffstat:
2 files changed, 293 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,14 +1,14 @@
-CFLAGS = -Wall -Wno-unused-function -Werror -O2 -g -Ideps/secp256k1/include -Ideps/lmdb
+CFLAGS = -Wall -Wno-unused-function -Werror -O2 -g -Ideps/secp256k1/include -Ideps/lmdb -Ideps/flatcc/include
HEADERS = sha256.h nostrdb.h cursor.h hex.h jsmn.h config.h sha256.h random.h memchr.h
SRCS = nostrdb.c sha256.c
LDS = $(SRCS) $(ARS)
+DEPS = $(SRCS) $(HEADERS) $(ARS)
ARS = deps/lmdb/liblmdb.a deps/secp256k1/.libs/libsecp256k1.a
LMDB_VER=0.9.31
FLATCC_VER=0.6.1
-DEPS = $(SRCS) $(HEADERS) $(ARS)
PREFIX ?= /usr/local
SUBMODULES = deps/secp256k1
-C_BINDINGS_PROFILE=bindings/c/profile_builder.h bindings/c/profile_reader.h bindings/c/profile_verifier.h
+C_BINDINGS_PROFILE=bindings/c/profile_builder.h bindings/c/profile_reader.h bindings/c/profile_verifier.h bindings/c/profile_json_parser.h
C_BINDINGS_COMMON=bindings/c/flatbuffers_common_builder.h bindings/c/flatbuffers_common_reader.h
C_BINDINGS=$(C_BINDINGS_COMMON) $(C_BINDINGS_PROFILE)
BINDINGS=bindings
@@ -43,7 +43,7 @@ config.h: configurator
bindings-c: $(C_BINDINGS)
bindings/%:
- mkdir -p $@
+ @mkdir -p $@
bindings/c/profile_builder.h: schemas/profile.fbs bindings/c
flatcc --builder $<
@@ -61,6 +61,10 @@ bindings/c/flatbuffers_common_builder.h: bindings/c
flatcc --common_builder
@mv flatbuffers_common_builder.h $@
+bindings/c/profile_json_parser.h: schemas/profile.fbs bindings/c
+ flatcc --json-parser $<
+ @mv profile_json_parser.h bindings/c
+
bindings-swift: bindings/swift/NdbProfile.swift
bindings/swift/NdbProfile.swift: schemas/profile.fbs bindings/swift
@@ -81,6 +85,7 @@ deps/flatcc/include/flatcc/flatcc.h: deps/flatcc_$(FLATCC_VER).tar.gz deps/.dir
tar xf $<
rm -rf deps/flatcc
mv flatcc-$(FLATCC_VER) deps/flatcc
+ touch $@
deps/lmdb/lmdb.h: deps/LMDB_$(LMDB_VER).tar.gz deps/.dir
tar xf $<
diff --git a/bindings/c/profile_json_parser.h b/bindings/c/profile_json_parser.h
@@ -0,0 +1,284 @@
+#ifndef PROFILE_JSON_PARSER_H
+#define PROFILE_JSON_PARSER_H
+
+/* Generated by flatcc 0.6.1 FlatBuffers schema compiler for C by dvide.com */
+
+#include "flatcc/flatcc_json_parser.h"
+#include "flatcc/flatcc_prologue.h"
+
+/*
+ * Parses the default root table or struct of the schema and constructs a FlatBuffer.
+ *
+ * Builder `B` must be initialized. `ctx` can be null but will hold
+ * hold detailed error info on return when available.
+ * Returns 0 on success, or error code.
+ * `flags` : 0 by default, `flatcc_json_parser_f_skip_unknown` silently
+ * ignores unknown table and structs fields, and union types.
+ */
+static int profile_parse_json(flatcc_builder_t *B, flatcc_json_parser_t *ctx,
+ const char *buf, size_t bufsiz, int flags);
+
+static const char *NdbProfile_parse_json_table(flatcc_json_parser_t *ctx, const char *buf, const char *end, flatcc_builder_ref_t *result);
+static const char *profile_local_json_parser_enum(flatcc_json_parser_t *ctx, const char *buf, const char *end,
+int *value_type, uint64_t *value, int *aggregate);
+static const char *profile_global_json_parser_enum(flatcc_json_parser_t *ctx, const char *buf, const char *end,
+ int *value_type, uint64_t *value, int *aggregate);
+
+static const char *NdbProfile_parse_json_table(flatcc_json_parser_t *ctx, const char *buf, const char *end, flatcc_builder_ref_t *result)
+{
+ int more;
+ void *pval;
+ flatcc_builder_ref_t ref, *pref;
+ const char *mark;
+ uint64_t w;
+
+ *result = 0;
+ if (flatcc_builder_start_table(ctx->ctx, 11)) goto failed;
+ buf = flatcc_json_parser_object_start(ctx, buf, end, &more);
+ while (more) {
+ buf = flatcc_json_parser_symbol_start(ctx, buf, end);
+ w = flatcc_json_parser_symbol_part(buf, end);
+ if (w < 0x6c75643136000000) { /* branch "lud16" */
+ if (w < 0x64616d75735f646f) { /* branch "damus_do" */
+ if ((w & 0xffffffffffff0000) == 0x62616e6e65720000) { /* "banner" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 6);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 4))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "banner" */
+ if ((w & 0xffffffffff000000) == 0x61626f7574000000) { /* "about" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 5);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 2))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "about" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "about" */
+ } /* "banner" */
+ } else { /* branch "damus_do" */
+ if (w == 0x64616d75735f646f) { /* descend "damus_do" */
+ buf += 8;
+ w = flatcc_json_parser_symbol_part(buf, end);
+ if (w == 0x6e6174696f6e5f76) { /* descend "nation_v" */
+ buf += 8;
+ w = flatcc_json_parser_symbol_part(buf, end);
+ if ((w & 0xff00000000000000) == 0x3200000000000000) { /* "2" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 1);
+ if (mark != buf) {
+ int32_t val = 0;
+ static flatcc_json_parser_integral_symbol_f *symbolic_parsers[] = {
+ profile_local_json_parser_enum,
+ profile_global_json_parser_enum, 0 };
+ buf = flatcc_json_parser_int32(ctx, (mark = buf), end, &val);
+ if (mark == buf) {
+ buf = flatcc_json_parser_symbolic_int32(ctx, (mark = buf), end, symbolic_parsers, &val);
+ if (buf == mark || buf == end) goto failed;
+ }
+ if (val != INT32_C(0) || (ctx->flags & flatcc_json_parser_f_force_add)) {
+ if (!(pval = flatcc_builder_table_add(ctx->ctx, 10, 4, 4))) goto failed;
+ flatbuffers_int32_write_to_pe(pval, val);
+ }
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "2" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "2" */
+ } else { /* descend "nation_v" */
+ if ((w & 0xffffffffffff0000) == 0x6e6174696f6e0000) { /* "nation" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 6);
+ if (mark != buf) {
+ int32_t val = 0;
+ static flatcc_json_parser_integral_symbol_f *symbolic_parsers[] = {
+ profile_local_json_parser_enum,
+ profile_global_json_parser_enum, 0 };
+ buf = flatcc_json_parser_int32(ctx, (mark = buf), end, &val);
+ if (mark == buf) {
+ buf = flatcc_json_parser_symbolic_int32(ctx, (mark = buf), end, symbolic_parsers, &val);
+ if (buf == mark || buf == end) goto failed;
+ }
+ if (val != INT32_C(0) || (ctx->flags & flatcc_json_parser_f_force_add)) {
+ if (!(pval = flatcc_builder_table_add(ctx->ctx, 9, 4, 4))) goto failed;
+ flatbuffers_int32_write_to_pe(pval, val);
+ }
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "nation" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "nation" */
+ } /* descend "nation_v" */
+ } else { /* descend "damus_do" */
+ if (w == 0x646973706c61795f) { /* descend "display_" */
+ buf += 8;
+ w = flatcc_json_parser_symbol_part(buf, end);
+ if ((w & 0xffffffff00000000) == 0x6e616d6500000000) { /* "name" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 4);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 5))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "name" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "name" */
+ } else { /* descend "display_" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* descend "display_" */
+ } /* descend "damus_do" */
+ } /* branch "damus_do" */
+ } else { /* branch "lud16" */
+ if (w < 0x6e69703035000000) { /* branch "nip05" */
+ if ((w & 0xffffffff00000000) == 0x6e616d6500000000) { /* "name" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 4);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 0))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "name" */
+ if ((w & 0xffffffffff000000) == 0x6c75643136000000) { /* "lud16" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 5);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 3))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "lud16" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "lud16" */
+ } /* "name" */
+ } else { /* branch "nip05" */
+ if (w < 0x7069637475726500) { /* branch "picture" */
+ if ((w & 0xffffffffff000000) == 0x6e69703035000000) { /* "nip05" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 5);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 8))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "nip05" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "nip05" */
+ } else { /* branch "picture" */
+ if (w < 0x7265616374696f6e) { /* branch "reaction" */
+ if ((w & 0xffffffffffffff00) == 0x7069637475726500) { /* "picture" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 7);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 7))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "picture" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "picture" */
+ } else { /* branch "reaction" */
+ if (w == 0x7265616374696f6e) { /* descend "reaction" */
+ buf += 8;
+ w = flatcc_json_parser_symbol_part(buf, end);
+ if ((w & 0xff00000000000000) == 0x7300000000000000) { /* "s" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 1);
+ if (mark != buf) {
+ uint8_t val = 0;
+ static flatcc_json_parser_integral_symbol_f *symbolic_parsers[] = {
+ profile_local_json_parser_enum,
+ profile_global_json_parser_enum, 0 };
+ buf = flatcc_json_parser_bool(ctx, (mark = buf), end, &val);
+ if (mark == buf) {
+ buf = flatcc_json_parser_symbolic_bool(ctx, (mark = buf), end, symbolic_parsers, &val);
+ if (buf == mark || buf == end) goto failed;
+ }
+ if (val != UINT8_C(1) || (ctx->flags & flatcc_json_parser_f_force_add)) {
+ if (!(pval = flatcc_builder_table_add(ctx->ctx, 6, 1, 1))) goto failed;
+ flatbuffers_bool_write_to_pe(pval, val);
+ }
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "s" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "s" */
+ } else { /* descend "reaction" */
+ if ((w & 0xffffffffffffff00) == 0x7765627369746500) { /* "website" */
+ buf = flatcc_json_parser_match_symbol(ctx, (mark = buf), end, 7);
+ if (mark != buf) {
+ buf = flatcc_json_parser_build_string(ctx, buf, end, &ref);
+ if (!ref || !(pref = flatcc_builder_table_add_offset(ctx->ctx, 1))) goto failed;
+ *pref = ref;
+ } else {
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ }
+ } else { /* "website" */
+ buf = flatcc_json_parser_unmatched_symbol(ctx, buf, end);
+ } /* "website" */
+ } /* descend "reaction" */
+ } /* branch "reaction" */
+ } /* branch "picture" */
+ } /* branch "nip05" */
+ } /* branch "lud16" */
+ buf = flatcc_json_parser_object_end(ctx, buf, end, &more);
+ }
+ if (ctx->error) goto failed;
+ if (!(*result = flatcc_builder_end_table(ctx->ctx))) goto failed;
+ return buf;
+failed:
+ return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_runtime);
+}
+
+static inline int NdbProfile_parse_json_as_root(flatcc_builder_t *B, flatcc_json_parser_t *ctx, const char *buf, size_t bufsiz, int flags, const char *fid)
+{
+ return flatcc_json_parser_table_as_root(B, ctx, buf, bufsiz, flags, fid, NdbProfile_parse_json_table);
+}
+
+static const char *profile_local_json_parser_enum(flatcc_json_parser_t *ctx, const char *buf, const char *end,
+ int *value_type, uint64_t *value, int *aggregate)
+{
+ /* Scope has no enum / union types to look up. */
+ return buf; /* unmatched; */
+}
+
+static const char *profile_global_json_parser_enum(flatcc_json_parser_t *ctx, const char *buf, const char *end,
+ int *value_type, uint64_t *value, int *aggregate)
+{
+ /* Global scope has no enum / union types to look up. */
+ return buf; /* unmatched; */
+}
+
+static int profile_parse_json(flatcc_builder_t *B, flatcc_json_parser_t *ctx,
+ const char *buf, size_t bufsiz, int flags)
+{
+ flatcc_json_parser_t parser;
+ flatcc_builder_ref_t root;
+
+ ctx = ctx ? ctx : &parser;
+ flatcc_json_parser_init(ctx, B, buf, buf + bufsiz, flags);
+ if (flatcc_builder_start_buffer(B, 0, 0, 0)) return -1;
+ NdbProfile_parse_json_table(ctx, buf, buf + bufsiz, &root);
+ if (ctx->error) {
+ return ctx->error;
+ }
+ if (!flatcc_builder_end_buffer(B, root)) return -1;
+ ctx->end_loc = buf;
+ return 0;
+}
+
+#include "flatcc/flatcc_epilogue.h"
+#endif /* PROFILE_JSON_PARSER_H */