Beispiel #1
0
        public List <String> GetTranslator(ISchemaClosureGenerator SchemaClosureGenerator, Dictionary <String, TypeDef> VersionedNameToType, TypeDef t, String NamespaceName)
        {
            var l             = new List <String>();
            var FromTypeDefs  = new List <TypeDef> {
            };
            var ToTypeDefs    = new List <TypeDef> {
            };
            var FromTypeSpecs = new List <TypeSpec> {
            };
            var ToTypeSpecs   = new List <TypeSpec> {
            };

            if (t.OnClientCommand)
            {
                FillTranslatorClientCommand(VersionedNameToType, t.ClientCommand, l, NamespaceName);
                var ToTypeClosure   = SchemaClosureGenerator.GetClosure(new List <TypeDef> {
                }, t.ClientCommand.OutParameters.Select(p => p.Type));
                var FromTypeClosure = SchemaClosureGenerator.GetClosure(new List <TypeDef> {
                }, t.ClientCommand.InParameters.Select(p => p.Type));
                ToTypeDefs    = ToTypeClosure.TypeDefs;
                ToTypeSpecs   = ToTypeClosure.TypeSpecs;
                FromTypeDefs  = FromTypeClosure.TypeDefs;
                FromTypeSpecs = FromTypeClosure.TypeSpecs;
            }
            else if (t.OnServerCommand)
            {
                FillTranslatorServerCommand(VersionedNameToType, t.ServerCommand, l, NamespaceName);
                var FromTypeClosure = SchemaClosureGenerator.GetClosure(new List <TypeDef> {
                }, t.ServerCommand.OutParameters.Select(p => p.Type));
                FromTypeDefs  = FromTypeClosure.TypeDefs;
                FromTypeSpecs = FromTypeClosure.TypeSpecs;
            }
            else
            {
                var ToTypeClosure = SchemaClosureGenerator.GetClosure(new List <TypeDef> {
                    t
                }, new List <TypeSpec> {
                });
                ToTypeDefs  = ToTypeClosure.TypeDefs;
                ToTypeSpecs = ToTypeClosure.TypeSpecs;
            }
            foreach (var td in FromTypeDefs)
            {
                if (td.Version() == "")
                {
                    continue;
                }
                if (TranslatedTypeFroms.Contains(td.VersionedName()))
                {
                    continue;
                }
                TranslatedTypeFroms.Add(td.VersionedName());
                if (td.OnAlias)
                {
                    FillTranslatorAliasFrom(VersionedNameToType, td.Alias, l, NamespaceName);
                }
                else if (td.OnRecord)
                {
                    FillTranslatorRecordFrom(VersionedNameToType, td.Record, l, NamespaceName);
                }
                else if (td.OnTaggedUnion)
                {
                    FillTranslatorTaggedUnionFrom(VersionedNameToType, td.TaggedUnion, l, NamespaceName);
                }
                else if (td.OnEnum)
                {
                    FillTranslatorEnumFrom(VersionedNameToType, td.Enum, l, NamespaceName);
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            foreach (var td in ToTypeDefs)
            {
                if (td.Version() == "")
                {
                    continue;
                }
                if (TranslatedTypeTos.Contains(td.VersionedName()))
                {
                    continue;
                }
                TranslatedTypeTos.Add(td.VersionedName());
                if (td.OnAlias)
                {
                    FillTranslatorAliasTo(VersionedNameToType, td.Alias, l, NamespaceName);
                }
                else if (td.OnRecord)
                {
                    FillTranslatorRecordTo(VersionedNameToType, td.Record, l, NamespaceName);
                }
                else if (td.OnTaggedUnion)
                {
                    FillTranslatorTaggedUnionTo(VersionedNameToType, td.TaggedUnion, l, NamespaceName);
                }
                else if (td.OnEnum)
                {
                    FillTranslatorEnumTo(VersionedNameToType, td.Enum, l, NamespaceName);
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            foreach (var ts in FromTypeSpecs)
            {
                if (IsSameType(ts, Nonversioned(ts), false))
                {
                    continue;
                }
                if (TranslatedTypeSpecFroms.Contains(ts.SimpleName(NamespaceName)))
                {
                    continue;
                }
                TranslatedTypeSpecFroms.Add(ts.SimpleName(NamespaceName));
                if (ts.OnTuple)
                {
                    FillTranslatorTupleFrom(VersionedNameToType, ts, l, NamespaceName);
                }
                else if (ts.OnGenericTypeSpec)
                {
                    var gts = ts.GenericTypeSpec;
                    if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Optional") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorOptionalFrom(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("List") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorListFrom(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Set") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorSetFrom(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Map") && gts.ParameterValues.Count == 2)
                    {
                        FillTranslatorMapFrom(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else
                    {
                        throw new InvalidOperationException(String.Format("NonListGenericTypeNotSupported: {0}", gts.TypeSpec.TypeRef.VersionedName()));
                    }
                }
            }
            foreach (var ts in ToTypeSpecs)
            {
                if (IsSameType(ts, Nonversioned(ts), false))
                {
                    continue;
                }
                if (TranslatedTypeSpecTos.Contains(ts.SimpleName(NamespaceName)))
                {
                    continue;
                }
                TranslatedTypeSpecTos.Add(ts.SimpleName(NamespaceName));
                if (ts.OnTuple)
                {
                    FillTranslatorTupleTo(VersionedNameToType, ts, l, NamespaceName);
                }
                else if (ts.OnGenericTypeSpec)
                {
                    var gts = ts.GenericTypeSpec;
                    if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Optional") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorOptionalTo(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("List") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorListTo(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Set") && gts.ParameterValues.Count == 1)
                    {
                        FillTranslatorSetTo(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else if (gts.TypeSpec.OnTypeRef && gts.TypeSpec.TypeRef.NameMatches("Map") && gts.ParameterValues.Count == 2)
                    {
                        FillTranslatorMapTo(VersionedNameToType, ts, l, NamespaceName);
                    }
                    else
                    {
                        throw new InvalidOperationException(String.Format("NonListGenericTypeNotSupported: {0}", gts.TypeSpec.TypeRef.VersionedName()));
                    }
                }
            }
            return(l);
        }
Beispiel #2
0
        public IEnumerable <String> JsonSerializationClient(UInt64 Hash, List <TypeDef> Commands, ISchemaClosureGenerator SchemaClosureGenerator, String NamespaceName)
        {
            yield return("private class ApplicationClient implements IApplicationClient");

            yield return("{");

            yield return("    public var s : IJsonSender;");

            yield return("    public var clientCommandCallbacks : Map<String, Array<{commandHash : String, _callback : String -> Void}>>;");

            yield return("");

            yield return("    public function new()");

            yield return("    {");

            yield return("    }");

            yield return("");

            yield return("    public var hash(get, null) : String;");

            yield return("    public function get_hash() : String");

            yield return("    {");

            foreach (var _Line in Combine(Combine(Combine(Begin(), "        return \""), Hash.ToString("X16", System.Globalization.CultureInfo.InvariantCulture)), "\";"))
            {
                yield return(_Line);
            }
            yield return("    }");

            yield return("");

            yield return("    public function dequeueCallback(commandName : String) : Void");

            yield return("    {");

            yield return("        clientCommandCallbacks.get(commandName).shift();");

            yield return("    }");

            yield return("");

            yield return("    private function addCallback(commandName : String, commandHash : String, _callback : String -> Void) : Void");

            yield return("    {");

            yield return("        if (clientCommandCallbacks.exists(commandName))");

            yield return("        {");

            yield return("            clientCommandCallbacks.get(commandName).push({commandHash : commandHash, _callback : _callback});");

            yield return("        }");

            yield return("        else");

            yield return("        {");

            yield return("            var q = new Array<{commandHash : String, _callback : String -> Void}>();");

            yield return("            q.push({commandHash : commandHash, _callback : _callback});");

            yield return("            clientCommandCallbacks.set(commandName, q);");

            yield return("        }");

            yield return("    }");

            yield return("");

            foreach (var c in Commands)
            {
                if (c.OnClientCommand)
                {
                    var CommandNameString = GetEscapedStringLiteral(c.ClientCommand.FullName());
                    var RequestTypeString = GetSuffixedTypeString(c.ClientCommand.Name, c.ClientCommand.Version, "Request", NamespaceName);
                    var ReplyTypeString   = GetSuffixedTypeString(c.ClientCommand.Name, c.ClientCommand.Version, "Reply", NamespaceName);
                    var RequestName       = GetSuffixedTypeName(c.ClientCommand.Name, c.ClientCommand.Version, "Request", NamespaceName);
                    var ReplyName         = GetSuffixedTypeName(c.ClientCommand.Name, c.ClientCommand.Version, "Reply", NamespaceName);
                    var Name        = c.ClientCommand.GetTypeSpec().SimpleName(NamespaceName);
                    var CommandHash = ((UInt32)(SchemaClosureGenerator.GetSubSchema(new List <TypeDef> {
                        c
                    }, new List <TypeSpec> {
                    }).GetNonversioned().GetNonattributed().Hash().Bits(31, 0))).ToString("X8", System.Globalization.CultureInfo.InvariantCulture);
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public function "), GetEscapedIdentifier(LowercaseCamelize(Name))), "(r : "), RequestTypeString), ", _callback : "), ReplyTypeString), " -> Void) : Void"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                    yield return("    " + "{");

                    foreach (var _Line in Combine(Combine(Combine(Begin(), "    var request = Json.stringify(JsonTranslator."), GetEscapedIdentifier(Combine(Combine(Begin(), LowercaseCamelize(RequestName)), "ToJson"))), "(r));"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "    addCallback("), CommandNameString), ", \""), CommandHash), "\", function(parameters) { return _callback(JsonTranslator."), GetEscapedIdentifier(Combine(Combine(Begin(), LowercaseCamelize(ReplyName)), "FromJson"))), "(Json.parse(parameters))); });"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "    s.send("), CommandNameString), ", \""), CommandHash), "\", request);"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                    yield return("    " + "}");
                }
                else if (c.OnServerCommand)
                {
                    var Name            = c.ServerCommand.GetTypeSpec().SimpleName(NamespaceName);
                    var EventTypeString = GetSuffixedTypeString(c.ServerCommand.Name, c.ServerCommand.Version, "Event", NamespaceName);
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public var "), GetEscapedIdentifier(LowercaseCamelize(Name))), " : "), EventTypeString), " -> Void;"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public function "), GetEscapedIdentifier(Combine(Combine(Begin(), "raise"), Name))), "(e : "), EventTypeString), ") : Void { if ("), GetEscapedIdentifier(LowercaseCamelize(Name))), " != null) { "), GetEscapedIdentifier(LowercaseCamelize(Name))), "(e); } }"))
                    {
                        yield return(_Line == "" ? "" : "    " + _Line);
                    }
                }
            }
            yield return("}");

            yield return("");

            yield return("@:final");

            yield return("class JsonSerializationClient");

            yield return("{");

            yield return("    public function getApplicationClient() : IApplicationClient");

            yield return("    {");

            yield return("        return c;");

            yield return("    }");

            yield return("");

            yield return("    private var c : ApplicationClient;");

            yield return("    private var serverCommands : Map<String, {commandHash : String, _callback : String -> Void}>;");

            yield return("");

            yield return("    public function new(s : IJsonSender)");

            yield return("    {");

            yield return("        c = new ApplicationClient();");

            yield return("        c.s = s;");

            yield return("        c.clientCommandCallbacks = new Map<String, Array<{commandHash : String, _callback : String -> Void}>>();");

            yield return("        serverCommands = new Map<String, {commandHash : String, _callback : String -> Void}>();");

            foreach (var c in Commands)
            {
                if (c.OnServerCommand)
                {
                    var CommandNameString = GetEscapedStringLiteral(c.ServerCommand.FullName());
                    var EventTypeString   = GetSuffixedTypeString(c.ServerCommand.Name, c.ServerCommand.Version, "Event", NamespaceName);
                    var EventName         = GetSuffixedTypeName(c.ServerCommand.Name, c.ServerCommand.Version, "Event", NamespaceName);
                    var Name        = c.ServerCommand.GetTypeSpec().SimpleName(NamespaceName);
                    var CommandHash = ((UInt32)(SchemaClosureGenerator.GetSubSchema(new List <TypeDef> {
                        c
                    }, new List <TypeSpec> {
                    }).GetNonversioned().GetNonattributed().Hash().Bits(31, 0))).ToString("X8", System.Globalization.CultureInfo.InvariantCulture);
                    foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "serverCommands.set("), CommandNameString), ", {commandHash : \""), CommandHash), "\", _callback : function(parameters) { c."), GetEscapedIdentifier(Combine(Combine(Begin(), "raise"), Name))), "(JsonTranslator."), GetEscapedIdentifier(Combine(Combine(Begin(), LowercaseCamelize(EventName)), "FromJson"))), "(Json.parse(parameters))); }});"))
                    {
                        yield return(_Line == "" ? "" : "        " + _Line);
                    }
                }
            }
            yield return("    }");

            yield return("");

            yield return("    public function handleResult(commandName : String, commandHash : String, parameters : String) : Void");

            yield return("    {");

            yield return("        if (c.clientCommandCallbacks.exists(commandName))");

            yield return("        {");

            yield return("            var q = c.clientCommandCallbacks.get(commandName);");

            yield return("            if (q.length == 0)");

            yield return("            {");

            yield return("                throw \"InvalidOperationException: \" + commandName + \"@\" + commandHash;");

            yield return("            }");

            yield return("            var callbackPair = q[0];");

            yield return("            if (callbackPair.commandHash != commandHash)");

            yield return("            {");

            yield return("                throw \"InvalidOperationException: \" + commandName + \"@\" + commandHash;");

            yield return("            }");

            yield return("            q.shift();");

            yield return("            var _callback = callbackPair._callback;");

            yield return("            _callback(parameters);");

            yield return("            return;");

            yield return("        }");

            yield return("");

            yield return("        if (serverCommands.exists(commandName))");

            yield return("        {");

            yield return("            var callbackPair = serverCommands.get(commandName);");

            yield return("            if (callbackPair.commandHash != commandHash)");

            yield return("            {");

            yield return("                throw \"InvalidOperationException: \" + commandName + \"@\" + commandHash;");

            yield return("            }");

            yield return("            var _callback = callbackPair._callback;");

            yield return("            _callback(parameters);");

            yield return("            return;");

            yield return("        }");

            yield return("");

            yield return("        throw \"InvalidOperationException: \" + commandName + \"@\" + commandHash;");

            yield return("    }");

            yield return("}");
        }