« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/serialize.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/serialize.js')
-rw-r--r--src/data/serialize.js38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/data/serialize.js b/src/data/serialize.js
new file mode 100644
index 0000000..9d4e888
--- /dev/null
+++ b/src/data/serialize.js
@@ -0,0 +1,38 @@
+// serialize-util.js: simple interface and utility functions for converting
+// Things into a directly serializeable format
+
+// Utility functions
+
+export function id(x) {
+    return x;
+}
+
+export function toRef(thing) {
+    return thing?.constructor.getReference(thing);
+}
+
+export function toRefs(things) {
+    return things?.map(toRef);
+}
+
+export function toContribRefs(contribs) {
+    return contribs?.map(({ who, what }) => ({who: toRef(who), what}));
+}
+
+// Interface
+
+export const serializeDescriptors = Symbol();
+
+export function serializeThing(thing) {
+    const descriptors = thing.constructor[serializeDescriptors];
+    if (!descriptors) {
+        throw new Error(`Constructor ${thing.constructor.name} does not provide serialize descriptors`);
+    }
+
+    return Object.fromEntries(Object.entries(descriptors)
+        .map(([ property, transform ]) => [property, transform(thing[property])]));
+}
+
+export function serializeThings(things) {
+    return things.map(serializeThing);
+}