-
David Sehnal authoredDavid Sehnal authored
transform.ts 2.54 KiB
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { StateObject } from './object';
import { Transformer } from './transformer';
import { UUID } from 'mol-util';
export interface Transform<A extends StateObject = StateObject, B extends StateObject = StateObject, P = unknown> {
readonly transformer: Transformer<A, B, P>,
readonly params: P,
readonly ref: Transform.Ref,
readonly version: string,
readonly defaultProps?: unknown
}
export namespace Transform {
export type Ref = string /* & { '@type': 'transform-ref' } */
export const RootRef = '-=root=-' as Ref;
export interface Options { ref?: Ref, defaultProps?: unknown }
export function create<A extends StateObject, B extends StateObject, P>(transformer: Transformer<A, B, P>, params?: P, options?: Options): Transform<A, B, P> {
const ref = options && options.ref ? options.ref : UUID.create() as string as Ref;
return {
transformer,
params: params || {} as any,
ref,
version: UUID.create(),
defaultProps: options && options.defaultProps
}
}
export function updateParams<T>(t: Transform, params: any): Transform {
return { ...t, params, version: UUID.create() };
}
export function createRoot(ref: Ref): Transform {
return create(Transformer.ROOT, {}, { ref });
}
export interface Serialized {
transformer: string,
params: any,
ref: string,
version: string,
defaultProps?: unknown
}
function _id(x: any) { return x; }
export function toJSON(t: Transform): Serialized {
const pToJson = t.transformer.definition.customSerialization
? t.transformer.definition.customSerialization.toJSON
: _id;
return {
transformer: t.transformer.id,
params: pToJson(t.params),
ref: t.ref,
version: t.version,
defaultProps: t.defaultProps
};
}
export function fromJSON(t: Serialized): Transform {
const transformer = Transformer.get(t.transformer);
const pFromJson = transformer.definition.customSerialization
? transformer.definition.customSerialization.toJSON
: _id;
return {
transformer,
params: pFromJson(t.params),
ref: t.ref as Ref,
version: t.version,
defaultProps: t.defaultProps
};
}
}