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