//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 ?? ""); } } }
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); }