import { Optional } from '../../Optional'; import { IEqualityComparer } from '../../Equality'; import { IInspector } from '../../IInspector'; import { IJsonSerializer, jsonSerializer } from './IJsonSerializer'; import { Json } from './Json'; import { isJsonSerializer } from './IsJsonSerializer'; import { DefaultSerializer, JsonSerializableConstructor } from './JsonSerializable'; import { Type } from '../../Type'; export class OptionalJsonSerializer implements IJsonSerializer> { public readonly [jsonSerializer] = true; private readonly _serializer: IJsonSerializer; private readonly _equalityComparer: Optional>; private readonly _inspector: Optional>; public constructor(typeSerializer?: IJsonSerializer | JsonSerializableConstructor, equalityComparer?: IEqualityComparer, inspector?: IInspector) { this._serializer = isJsonSerializer(typeSerializer) ? typeSerializer : new DefaultSerializer(typeSerializer); // TODO: Require a mandatory serializer for non-primatives? this._equalityComparer = new Optional(equalityComparer); this._inspector = new Optional(inspector); } public serialize(object: Optional): Json { if (!object.isPresent()) { return null; } const value = object.get(); return this._serializer.serialize(value); } public deserialize(json: Json): Optional { if (Type.isNull(json) || Type.isUndefined(json)) { return new Optional(null, this._equalityComparer.orUndefined(), this._inspector.orUndefined()); } const value = this._serializer.deserialize(json); return new Optional(value, this._equalityComparer.orUndefined(), this._inspector.orUndefined()); } }