/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal */ import { StateObject } from '../object'; import { Transformer } from '../transformer'; import { UUID } from 'mol-util'; export interface Transform { readonly transformer: Transformer, readonly params: P, readonly ref: Transform.Ref, readonly version: string, readonly defaultProps?: unknown } export namespace Transform { export type Ref = string export interface Props { ref: Ref } export enum Flags { // Indicates that the transform was generated by a behaviour and should not be automatically updated Generated } export function create(transformer: Transformer, params?: P, props?: Partial): Transform { const ref = props && props.ref ? props.ref : UUID.create() as string as Ref; return { transformer, params: params || { } as any, ref, version: UUID.create() } } export function updateParams(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, version: t.version, defaultProps: t.defaultProps }; } }