about summary refs log tree commit diff
path: root/src/state/queries/nuxs/util.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/queries/nuxs/util.ts')
-rw-r--r--src/state/queries/nuxs/util.ts52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/state/queries/nuxs/util.ts b/src/state/queries/nuxs/util.ts
new file mode 100644
index 000000000..d65b86a34
--- /dev/null
+++ b/src/state/queries/nuxs/util.ts
@@ -0,0 +1,52 @@
+import {AppBskyActorDefs, nuxSchema} from '@atproto/api'
+
+import {
+  AppNux,
+  Nux,
+  nuxNames,
+  NuxSchemas,
+} from '#/state/queries/nuxs/definitions'
+
+export function parseAppNux(nux: AppBskyActorDefs.Nux): AppNux | undefined {
+  if (!nuxNames.has(nux.id as Nux)) return
+  if (!nuxSchema.safeParse(nux).success) return
+
+  const {data, ...rest} = nux
+
+  const schema = NuxSchemas[nux.id as Nux]
+
+  if (schema && data) {
+    const parsedData = JSON.parse(data)
+
+    if (!schema.safeParse(parsedData).success) return
+
+    return {
+      ...rest,
+      data: parsedData,
+    } as AppNux
+  }
+
+  return {
+    ...rest,
+    data: undefined,
+  } as AppNux
+}
+
+export function serializeAppNux(nux: AppNux): AppBskyActorDefs.Nux {
+  const {data, ...rest} = nux
+  const schema = NuxSchemas[nux.id as Nux]
+
+  const result: AppBskyActorDefs.Nux = {
+    ...rest,
+    data: undefined,
+  }
+
+  if (schema) {
+    schema.parse(data)
+    result.data = JSON.stringify(data)
+  }
+
+  nuxSchema.parse(result)
+
+  return result
+}