@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
84 lines • 5.12 kB
JavaScript
export class MapSerializer {
serialize(x, serializerContext) {
if (x === undefined) {
return serializerContext.serializedDefaultValue;
}
if (x === null) {
return serializerContext.serializedNullValue;
}
if (x instanceof Map) {
return serializerContext.defineReference(x, () => {
const map = x;
const array = new Array(x.size);
const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);
const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);
const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();
const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();
const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();
const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();
keySerializerContext.jsonPathKey = 'key';
keySerializerContext.typeState = genericKeySerializerContext.typeState;
keySerializerContext.referenceValueSetter = (v, k) => array[keyArraySerializerContext.jsonPathKey][k] = v;
valueSerializerContext.jsonPathKey = 'value';
valueSerializerContext.typeState = genericValueSerializerContext.typeState;
valueSerializerContext.referenceValueSetter = (v, k) => array[valueArraySerializerContext.jsonPathKey][k] = v;
const keySerializer = keySerializerContext.serializer;
const valueSerializer = valueSerializerContext.serializer;
let i = -1;
for (const [mk, mv] of map.entries()) {
i++;
keyArraySerializerContext.jsonPathKey = i;
valueArraySerializerContext.jsonPathKey = i;
array[i] = {};
array[i][keySerializerContext.jsonPathKey] = keySerializer.serialize(mk, keySerializerContext);
array[i][valueSerializerContext.jsonPathKey] = valueSerializer.serialize(mv, valueSerializerContext);
}
return array;
});
}
serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: cannot serialize value as map.`, 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 map = new Map();
const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);
const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);
const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();
const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();
const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();
const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();
keySerializerContext.jsonPathKey = 'key';
keySerializerContext.typeState = genericKeySerializerContext.typeState;
keySerializerContext.referenceValueSetter = v => map.set(v, undefined);
valueSerializerContext.jsonPathKey = 'value';
valueSerializerContext.typeState = genericValueSerializerContext.typeState;
valueSerializerContext.referenceValueSetter = v => map.set(v, undefined);
const keySerializer = keySerializerContext.serializer;
const valueSerializer = valueSerializerContext.serializer;
for (let i = 0; i < array.length; i++) {
const mk = array[i][keySerializerContext.jsonPathKey];
const mv = array[i][valueSerializerContext.jsonPathKey];
keyArraySerializerContext.jsonPathKey = i;
valueArraySerializerContext.jsonPathKey = i;
const key = keySerializer.deserialize(mk, keySerializerContext);
valueSerializerContext.referenceValueSetter = v => map.set(key, v);
const value = valueSerializer.deserialize(mv, valueSerializerContext);
map.set(key, value);
}
return map;
});
}
serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: Cannot deserialize value as map!`, x);
return undefined;
}
}
//# sourceMappingURL=map-serializer.js.map