Skip to content
Snippets Groups Projects
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
        };
    }
}