import { Utils } from "../Utils"; import { Types } from "../server/Message"; import { NumberField } from "./NumberField"; import { TextField } from "./TextField"; import { RichTextField } from "./RichTextField"; import { KeyStore, Key } from "./Key"; import { ImageField } from "./ImageField"; import { ListField } from "./ListField"; import { Document } from "./Document"; import { Server } from "../client/Server"; export function Cast(field: FieldValue, ctor: { new(): T }): Opt { if (field) { if (ctor && field instanceof ctor) { return field; } } return undefined; } export let FieldWaiting: FIELD_WAITING = ""; export type FIELD_WAITING = ""; export type FIELD_ID = string | undefined; export type Opt = T | undefined; export type FieldValue = Opt | FIELD_WAITING; export abstract class Field { //FieldUpdated: TypedEvent> = new TypedEvent>(); private id: FIELD_ID; get Id(): FIELD_ID { return this.id; } constructor(id: FIELD_ID = undefined) { this.id = id || Utils.GenerateGuid(); } Dereference(): FieldValue { return this; } DereferenceToRoot(): FieldValue { return this; } DereferenceT(ctor: { new(): T }): FieldValue { return Cast(this.Dereference(), ctor); } DereferenceToRootT(ctor: { new(): T }): FieldValue { return Cast(this.DereferenceToRoot(), ctor); } Equals(other: Field): boolean { return this.id === other.id; } abstract ToScriptString(): string; abstract TrySetValue(value: any): boolean; abstract GetValue(): any; abstract Copy(): Field; abstract ToJson(): { id: string, type: Types, data: any } public static FromJson(obj: { id: string, type: number, data: any }): Field { let data: any = obj.data let id: string = obj.id switch (obj.type) { case Types.Number: return new NumberField(data, id) case Types.Text: return new TextField(data, id) case Types.RichText: return new RichTextField(data, id) case Types.Key: return new Key(data, id) case Types.Image: return new ImageField(data, id) case Types.List: return new ListField(data, id) case Types.Document: let doc: Document = new Document(id) let fields: [string, string][] = data as [string, string][] fields.forEach(element => { let keyId: string = element[0] let valueId: string = element[1] Server.GetField(keyId, (key: Field) => { if (key instanceof Key) { Server.GetField(valueId, (field: Field) => { doc.Set(key as Key, field) }) } else { console.log("how did you get a key that isnt a key wtf") } }) }); return doc } return new TextField(data, id) } }