view Resources/CodeGeneration/template.in.ts @ 491:8e7e151ef472 bgo-commands-codegen

Unit tests pass for enum generation
author bgo-osimis
date Wed, 20 Feb 2019 20:51:30 +0100
parents 6470248790db
children 6fbf2eae7c88
line wrap: on
line source

/*
         1         2         3         4         5         6         7
12345678901234567890123456789012345678901234567890123456789012345678901234567890
*/

namespace {{rootName}}
{
  function StoneCheckSerializedValueType(value: any, typeStr: string)
  {
    StoneCheckSerializedValueTypeGeneric(value);

    if (value['type'] != typeStr)
    {
      throw new Error(
        `Cannot deserialize type ${value['type']} into ${typeStr}`);
    }
  }

  function isString(val: any) :boolean
  {
    return ((typeof val === 'string') || (val instanceof String));
  }
  
  function StoneCheckSerializedValueTypeGeneric(value: any)
  {
    if ( (!('type' in value)) || (!isString(value)) )
    {
      throw new Error(
        "Cannot deserialize value ('type' key invalid)");
    }
  }

// end of generic methods
{% for enum in enums%}
  export enum {{enum['name']}} {
    {% for key in enumDict.keys()%}
    {{key}},
    {%endfor%}
  };
{%endfor%}

  export class Message1 {
    a: number;
    b: string;
    c: EnumMonth0;
    d: boolean;
    public StoneSerialize(): string {
      let container: object = {};
      container['type'] = 'VsolStuff.Message1';
      container['value'] = this;
      return JSON.stringify(container);
    }
  };

  export class Message2 {
    constructor()
    {
      this.tata = new Array<Message1>();
      this.tutu = new Array<string>();
      this.titi = new Map<string, string>();
      this.lulu = new Map<string, Message1>();  
    }
    toto: string;
    tata: Message1[];
    tutu: string[];
    titi: Map<string, string>;
    lulu: Map<string, Message1>;

    public StoneSerialize(): string {
      let container: object = {};
      container['type'] = 'VsolStuff.Message2';
      container['value'] = this;
      return JSON.stringify(container);
    }
    public static StoneDeserialize(valueStr: string) : Message2
    {
      let value: any = JSON.parse(valueStr);
      StoneCheckSerializedValueType(value, "VsolStuff.Message2");
      let result: Message2 = value['value'] as Message2;
      return result;
    }
    };

  export interface IDispatcher
  {
    HandleMessage1(value: Message1): boolean;
    HandleMessage2(value: Message2): boolean;
  };

  /** Service function for StoneDispatchToHandler */
  export function StoneDispatchJsonToHandler(
    jsonValueStr: string, dispatcher: IDispatcher): boolean
  {
    let jsonValue: any = JSON.parse(jsonValueStr);
    StoneCheckSerializedValueTypeGeneric(jsonValue);
    let type: string = jsonValue["type"];
    if (type == "")
    {
      // this should never ever happen
      throw new Error("Caught empty type while dispatching");
    }
    else if (type == "VsolStuff.Message1")
    {
      let value = jsonValue["value"] as Message1;
      return dispatcher.HandleMessage1(value);
    }
    else if (type == "VsolStuff.Message2")
    {
      let value = jsonValue["value"] as Message2;
      return dispatcher.HandleMessage2(value);
    }
    else
    {
      return false;
    }
  }

  /** Takes a serialized type and passes this to the dispatcher */
  export function StoneDispatchToHandler(
    strValue: string, dispatcher: IDispatcher): boolean
  {
    let jsonValue: any = JSON.parse(strValue)
    return StoneDispatchJsonToHandler(jsonValue, dispatcher);
  }
}