@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
55 lines • 2.51 kB
JavaScript
export class SetSerializer {
serialize(x, serializerContext) {
if (x === undefined) {
return serializerContext.serializedDefaultValue;
}
if (x === null) {
return serializerContext.serializedNullValue;
}
if (x instanceof Set) {
return serializerContext.defineReference(x, () => {
const set = x;
const array = new Array(set.size);
const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);
const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();
const serializer = valueSerializerContext.serializer;
valueSerializerContext.referenceValueSetter = (v, k) => array[k] = v;
let i = -1;
for (const v of set) {
i++;
valueSerializerContext.jsonPathKey = i;
array[i] = serializer.serialize(v, valueSerializerContext);
}
return array;
});
}
serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot serialize value as set.`, x);
return undefined;
}
deserialize(x, serializerContext) {
if (x === undefined) {
return serializerContext.deserializedDefaultValue;
}
if (x === null) {
return serializerContext.deserializedNullValue;
}
if (Array.isArray(x)) {
return serializerContext.restoreReference(x, () => {
const array = x;
const set = new Set();
const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);
const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();
const serializer = valueSerializerContext.serializer;
valueSerializerContext.referenceValueSetter = v => set.add(v);
for (let i = 0; i < array.length; i++) {
valueSerializerContext.jsonPathKey = i;
set.add(serializer.deserialize(array[i], valueSerializerContext));
}
return set;
});
}
serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot deserialize value as set.`, x);
return undefined;
}
}
//# sourceMappingURL=set-serializer.js.map