Mercurial > hg > orthanc-stone
diff 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 diff
--- a/Resources/CodeGeneration/template.in.ts Mon Feb 18 15:38:05 2019 +0100 +++ b/Resources/CodeGeneration/template.in.ts Wed Feb 20 20:51:30 2019 +0100 @@ -1,38 +1,125 @@ -class Greeter { - greeting: string; - constructor(message: string) { - this.greeting = message; +/* + 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}`); } - greet() { - return "Hello, " + this.greeting; + } + + 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)"); } -} -enum Color { Red, Green, Blue }; + } + +// 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); + } + }; -class TestMessage { - s1: string; - s2: Array<string>; - s3: Array<Array<string>>; - s4: Map<string, number>; - s5: Map<number, Array<string>>; - s6: Color; - s7: boolean; -} + 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; + }; -let tm = new TestMessage(); -tm.s2 = new Array<string>() -tm.s2.push("toto"); -tm.s2.push("toto2"); -tm.s2.push("toto3"); -tm.s4 = new Map<string, number>(); -tm.s4["toto"] = 42; -tm.s4["toto"] = 1999; -tm.s4["tatata"] = 1999; -tm.s6 = Color.Red; -tm.s7 = true + /** 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; + } + } -let txt = JSON.stringify(tm) -console.log(txt); - -let greeter = new Greeter("world"); - + /** 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); + } +}