2 using System.Collections.Generic;
 
    4 using System.Xml.Serialization;
 
    5 using CodeGen.generators;
 
    9 using YamlDotNet.Serialization;
 
   10 using YamlDotNet.Serialization.NamingConventions;
 
   17     public static class ExecuteConf
 
   19         private const string OutputDir = 
"out";
 
   24         public static void Execute(
string langName, 
string fileName, 
bool toStdout)
 
   26             var lang = GeneratorConf.GetLanguage(langName);
 
   27             var gen = lang.Generator;
 
   28             if (gen == null) 
throw new NullReferenceException(
"This language has no generator");
 
   30             var pkg = string.IsNullOrWhiteSpace(fileName)
 
   32                 : ParseFile(fileName);
 
   34             lang.Normalizer?.NormalizePackage(ref pkg);
 
   36             var data = gen.Generate(pkg);
 
   40                 PutDataToStdout(data, lang);
 
   44                 PutDataToFiles(data, lang);
 
   48         private static Package ParseFile(
string filename)
 
   50             return ParseFileByFormat(GetSerializedData(filename), filename);
 
   60         public static Package ParseFileByFormat(
string body, 
string fileName)
 
   64             var fileFormat = Utils.GetFileFormat(fileName);
 
   69                     pkg = DeserializeXml(body);
 
   72                     pkg = DeserializeJson(body);
 
   75                     pkg = DeserializeYaml(body);
 
   78                     throw new InvalidDataException(
"Invalid format of '" + fileName + 
"' file.");
 
   84         private static string GetSerializedData(
string fileName)
 
   86             var allowedSchemes = 
new[] {Uri.UriSchemeHttp, Uri.UriSchemeHttps, Uri.UriSchemeFtp, Uri.UriSchemeFtp};
 
   88             var result = Uri.TryCreate(fileName, UriKind.Absolute, out var uriResult)
 
   89                          && Array.IndexOf(allowedSchemes, uriResult.Scheme) > -1
 
   90                 ? Utils.Download(fileName)
 
   91                 : Utils.Read(fileName);
 
   96         private static void PutDataToFiles(Dictionary<string, string> fileContextMap, 
Languange lang)
 
   98             var ext = lang.Extension;
 
   99             Directory.CreateDirectory(OutputDir);
 
  100             foreach (var file 
in fileContextMap)
 
  102                 Utils.Write(OutputDir + 
"/" + file.Key + 
'.' + ext, file.Value);
 
  105             Console.WriteLine(
"Generated successfully.");
 
  108         private static void PutDataToStdout(Dictionary<string, string> fileContextMap, 
Languange lang)
 
  110             var ext = lang.Extension;
 
  111             var comment = lang.Comment;
 
  113             foreach (var file 
in fileContextMap)
 
  117                     filename = string.Format(comment, file.Key + 
"." + ext);
 
  120                 Console.WriteLine(filename);
 
  121                 Console.WriteLine(file.Value);
 
  130         public static Package DeserializeYaml(
string body)
 
  134                 var deserializer = 
new DeserializerBuilder()
 
  135                     .WithNamingConvention(
new CamelCaseNamingConvention())
 
  137                 var pkg = deserializer.Deserialize<
Package>(
new StringReader(body));
 
  140             catch (YamlException)
 
  142                 throw new InvalidDataException(
"invalid Yaml file content");
 
  152         public static Package DeserializeJson(
string body)
 
  156                 return JsonConvert.DeserializeObject<
Package>(body);
 
  160                 throw new InvalidDataException(
"invalid Json file content");
 
  170         public static Package DeserializeXml(
string body)
 
  174                 var serializer = 
new XmlSerializer(typeof(
Package));
 
  175                 using (TextReader reader = 
new StringReader(body))
 
  177                     return (
Package) serializer.Deserialize(reader);
 
  182                 throw new InvalidDataException(
"invalid XML file content");
 
The class that describes programming language and has a generator for it 
The structure that describes package. Contains classes and subpackages