Exemple #1
0
        //private bool ValidateImport(string path) => ResolveImport(path) != null;
        //private string ResolveImport(string path)
        //{
        //    // only allow the things that we actively find under "protoc" on the web root,
        //    // remembering to normalize our slashes; this means that c:\... or ../../ etc will
        //    // all fail, as they are not in "legalImports"
        //    if (legalImports == null)
        //    {
        //        var tmp = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        //        var root = Path.Combine(_host.WebRootPath, "protoc");
        //        foreach (var found in Directory.EnumerateFiles(root, "*.proto", SearchOption.AllDirectories))
        //        {
        //            if (found.StartsWith(root))
        //            {
        //                tmp.Add(found.Substring(root.Length).TrimStart(DirSeparators)
        //                    .Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), found);
        //            }
        //        }
        //        legalImports = tmp;
        //    }
        //    return legalImports.TryGetValue(path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar),
        //        out string actual) ? actual : null;
        //}

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (firstRender)
            {
                await Monaco.InitializeAsync();

                Monaco.CreateEditor("protocontainer", "", "proto3lang");
                Monaco.CreateEditor("csharpcontainer", "", "csharp", true);

                var index = UriHelper.Uri.IndexOf("#g");
                if (index > -1)
                {
                    string gisttId = UriHelper.Uri.Substring(index + 2);
                    var    result  = await Http.GetJsonAsync <Gist>("https://api.github.com/gists/" + gisttId);

                    Monaco.SetCode("protocontainer", result?.Files?.Values?.FirstOrDefault()?.Content ?? "");
                }
            }
        }
Exemple #2
0
        public void Generate()
        {
            CodeGenResult = null;

            string schema = Monaco.GetCode("protocontainer");

            if (string.IsNullOrWhiteSpace(schema))
            {
                return;
            }

            Dictionary <string, string> options = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            options["langver"] = LangVer;
            if (OneOfEnum)
            {
                options["oneof"] = "enum";
            }
            if (ListSet)
            {
                options["listset"] = "yes";
            }

            NameNormalizer nameNormalizer = null;

            switch (Names)
            {
            case "auto":
                nameNormalizer = NameNormalizer.Default;
                break;

            case "original":
                nameNormalizer = NameNormalizer.Null;
                break;
            }
            var result = new GenerateResult();

            try
            {
                using (var reader = new StringReader(schema))
                {
                    var set = new FileDescriptorSet
                    {
                        //ImportValidator = path => ValidateImport(path),
                    };
                    //set.AddImportPath(Path.Combine(_host.WebRootPath, "protoc"));
                    set.Add("my.proto", true, reader);

                    set.Process();
                    var errors = set.GetErrors();

                    if (errors.Length > 0)
                    {
                        result.ParserExceptions = errors;
                    }
                    CodeGenerator codegen;
                    switch (Tooling)
                    {
                    case "protogen:VB":
#pragma warning disable 0618
                        codegen = VBCodeGenerator.Default;
#pragma warning restore 0618
                        break;

                    case "protogen:C#":
                    default:
                        codegen = CSharpCodeGenerator.Default;
                        break;
                    }
                    result.Files = codegen.Generate(set, nameNormalizer, options).ToArray();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                result.Exception = ex.Message;
            }
            CodeGenResult = result;
            Monaco.SetCode("csharpcontainer", CodeGenResult?.Files?.FirstOrDefault()?.Text ?? "");
            JSInProcess.InvokeVoid("processResults", CodeGenResult);
        }