Initial commit

This commit is contained in:
2020-04-13 15:16:46 +01:00
commit 17a40cb95f
81 changed files with 10120 additions and 0 deletions
@@ -0,0 +1,72 @@
using AutoBet.ApiGenerator.Extensions;
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;
namespace AutoBet.ApiGenerator
{
internal class ApiClassessGenerator
{
public string _inputXmlFile { get; }
public string _outputFilesDirectory { get; }
public ApiClassessGenerator(string inputXmlFile, string outputFilesDirectory)
{
_inputXmlFile = inputXmlFile;
_outputFilesDirectory = outputFilesDirectory;
}
internal void Process(string namespaceValue, string modelFolder)
{
var doc = XDocument.Load(_inputXmlFile);
var nodes = doc.Root.Elements("dataType");
namespaceValue += "." + modelFolder;
var modelsDirectory = Path.Combine(_outputFilesDirectory, modelFolder);
Directory.CreateDirectory(modelsDirectory);
foreach (var node in nodes)
{
var sb = new StringBuilder();
CSharpClassBuilder.UsingHeader(sb, namespaceValue, namespaceValue + ".Enums");
var descriptionNode = node.Element("description");
if (descriptionNode != null && !String.IsNullOrWhiteSpace(descriptionNode.Value))
{
CSharpClassBuilder.Summary(sb, descriptionNode.Value, isClassSummary: true);
}
var name = node.Attribute("name").Value;
CSharpClassBuilder.ClassHeader(sb, name);
var parameters = node.Elements("parameter");
foreach(var parameter in parameters)
{
sb.AppendWithIndent(8, "public ");
var parameterReturnType = CSharpClassBuilder.GetDataType(parameter.Attribute("type").Value);
sb.Append(parameterReturnType);
sb.Append(" ");
var parameterName = parameter.Attribute("name").Value;
for(var i = 0; i < parameterName.Length; i++)
{
if(i == 0)
{
sb.Append(Char.ToUpper(parameterName[i]));
continue;
}
sb.Append(parameterName[i]);
}
sb.Append(" { get; set; }");
sb.AppendLine();
}
CSharpClassBuilder.ClassFooter(sb);
CSharpClassBuilder.UsingFooter(sb);
File.WriteAllText(Path.Combine(modelsDirectory, $"{name}.cs"), sb.ToString());
}
}
}
}
+153
View File
@@ -0,0 +1,153 @@
using AutoBet.ApiGenerator.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace AutoBet.ApiGenerator
{
internal class ApiClientGenetaor
{
private string _inputXmlFile { get; }
private string _outputFilesDirectory { get; }
public ApiClientGenetaor(string inputXmlFile, string outputFilesDirectory)
{
_inputXmlFile = inputXmlFile;
_outputFilesDirectory = outputFilesDirectory;
}
public void Process(string apiClientName, string namespaceValue)
{
var doc = XDocument.Load(_inputXmlFile);
var sb = new StringBuilder();
sb.AppendLine("using System;");
sb.AppendLine("using System.Collections.Generic;");
sb.AppendLine("using System.Net.Http;");
sb.AppendLine("using System.Net.Http.Headers;");
sb.AppendLine("using System.Text;");
sb.AppendLine("using System.Threading.Tasks;");
sb.AppendFormat("using {0}.{1}{2};", namespaceValue, apiClientName, "Models");
sb.AppendLine();
sb.AppendFormat("using {0}.{1}{2};", namespaceValue, apiClientName, "Models.Enums");
sb.AppendLine();
sb.AppendLine();
sb.Append("namespace ");
sb.Append(namespaceValue);
sb.AppendLine();
sb.AppendLine("{");
sb.AppendWithIndent(4, "public class ");
sb.Append(apiClientName);
sb.Append("ApiClient");
sb.AppendLine();
sb.AppendWithIndent(4, "{\r\n");
var nodes = doc.Root.Elements("operation");
foreach(var node in nodes)
{
AppendDescription(sb, node);
sb.AppendWithIndent(8, "public ");
var paramaeters = node.Element("parameters");
var response = paramaeters.Element("simpleResponse");
sb.Append("async Task<");
var returnType = CSharpClassBuilder.GetDataType(response.Attribute("type").Value);
sb.Append(returnType);
sb.Append("> ");
var camelcaseMethodName = node.Attribute("name").Value;
var methodName = GetMethodName(camelcaseMethodName);
sb.Append(methodName);
var parametersAppended = AppendParameters(sb, paramaeters.Element("request"));
sb.AppendWithIndent(8, "{\r\n");
AppendMethodBody(sb, returnType, camelcaseMethodName + "/", parametersAppended);
sb.AppendWithIndent(8, "}\r\n\r\n");
}
sb.Remove(sb.Length - 2, 2);
sb.AppendWithIndent(4, "}\r\n");
sb.Append("}");
File.WriteAllText(Path.Combine(_outputFilesDirectory, $"{apiClientName}ApiClient.cs"), sb.ToString());
}
private void AppendMethodBody(StringBuilder sb, string returnType, string endpoint, string[] paramaters)
{
var request = "";
if(paramaters.Length > 0)
{
sb.AppendWithIndent(12, "var request = new\r\n");
sb.AppendWithIndent(12, "{\r\n");
foreach (var parameter in paramaters)
{
sb.AppendWithIndent(16, parameter);
sb.Append(",\r\n");
}
sb.Remove(sb.Length - 3, 3);
sb.Append("\r\n");
sb.AppendWithIndent(12, "};\r\n");
request = ", request";
}
sb.AppendWithIndent(12, "var result = await ExecuteRequest<");
sb.Append(returnType);
sb.Append(">(_endpoint + \"");
sb.Append(endpoint);
sb.Append("\"");
sb.Append(request);
sb.Append(");\r\n");
sb.AppendWithIndent(12, "return result;\r\n");
}
private string[] AppendParameters(StringBuilder sb, XElement request)
{
var paramatersAppended = new List<string>();
sb.Append("(");
var parameters = request.Elements("parameter");
foreach (var parameter in parameters)
{
var name = parameter.Attribute("name").Value;
var type = CSharpClassBuilder.GetDataType(parameter.Attribute("type").Value);
sb.Append(type);
var mandatory = parameter.Attribute("mandatory");
var isRequired = mandatory != null && mandatory.Value != null && mandatory.Value == "true";
if (!isRequired && (type == "int" || type == "long" || type == "bool"))
{
sb.Append("?");
}
sb.Append(" ");
sb.Append(name);
if (!isRequired)
{
sb.Append(" = null");
}
paramatersAppended.Add(name);
sb.Append(", ");
}
if(parameters.Any())
{
sb.Remove(sb.Length - 2, 2);
}
sb.Append(")\r\n");
return paramatersAppended.ToArray();
}
private void AppendDescription(StringBuilder sb, XElement node)
{
var description = node.Element("description").Value;
if (!String.IsNullOrWhiteSpace(description))
{
CSharpClassBuilder.Summary(sb, description);
}
}
private static string GetMethodName(string methodName)
{
return Char.ToUpper(methodName[0]).ToString() + methodName.Substring(1, methodName.Length - 1);
}
}
}
+89
View File
@@ -0,0 +1,89 @@
using AutoBet.ApiGenerator.Extensions;
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;
namespace AutoBet.ApiGenerator
{
internal class ApiEnumsGenerator
{
public string _inputXmlFile { get; }
public string _outputFilesDirectory { get; }
public ApiEnumsGenerator(string inputXmlFile, string outputFilesDirectory)
{
_inputXmlFile = inputXmlFile;
_outputFilesDirectory = outputFilesDirectory;
}
internal void Process(string namespaceValue, string modelFolder, string enumFolder)
{
var doc = XDocument.Load(_inputXmlFile);
var nodes = doc.Root.Elements("simpleType");
namespaceValue += $".{modelFolder}.{enumFolder}";
var enumsDirectory = Path.Combine(_outputFilesDirectory, modelFolder, enumFolder);
Directory.CreateDirectory(enumsDirectory);
foreach (var node in nodes)
{
var sb = new StringBuilder();
CSharpClassBuilder.UsingHeader(sb, namespaceValue, "System.Runtime.Serialization");
var descriptionNode = node.Element("description");
if (descriptionNode != null && !String.IsNullOrWhiteSpace(descriptionNode.Value))
{
CSharpClassBuilder.Summary(sb, descriptionNode.Value, isClassSummary: true);
}
var name = node.Attribute("name").Value;
CSharpClassBuilder.EnumHeader(sb, name);
var validValues = node.Element("validValues");
if (validValues == null)
{
continue;
}
var enumValues = validValues.Elements("value");
foreach(var enumValue in enumValues)
{
var parameterName = enumValue.Attribute("name").Value;
sb.AppendWithIndent(8, "");
sb.AppendFormat("[EnumMember(Value = \"{0}\")]", parameterName);
sb.AppendLine();
sb.AppendWithIndent(8, "");
var upperCaseNextLetter = true;
for (var i = 0; i < parameterName.Length; i++)
{
if (upperCaseNextLetter)
{
upperCaseNextLetter = false;
sb.Append(Char.ToUpper(parameterName[i]));
continue;
}
if(parameterName[i] == '_')
{
upperCaseNextLetter = true;
continue;
}
sb.Append(Char.ToLower(parameterName[i]));
}
sb.Append(',');
sb.AppendLine();
}
sb.Remove(sb.Length - 3, 3);
sb.AppendLine();
CSharpClassBuilder.ClassFooter(sb);
CSharpClassBuilder.UsingFooter(sb);
File.WriteAllText(Path.Combine(enumsDirectory, $"{name}.cs"), sb.ToString());
}
}
}
}
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="SuccessfulCodeTools" Version="1.0.8" />
</ItemGroup>
</Project>
+103
View File
@@ -0,0 +1,103 @@
using AutoBet.ApiGenerator.Extensions;
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoBet.ApiGenerator
{
public static class CSharpClassBuilder
{
public static void Summary(StringBuilder sb, string summary, bool isClassSummary = false)
{
var indentSpaces = isClassSummary ? 4 : 8;
if (!String.IsNullOrWhiteSpace(summary))
{
sb.AppendWithIndent(indentSpaces, "/// <summary>\r\n");
var descriptionLines = summary.Trim().TrimEnd('\n').Replace("\r", "").Split('\n');
foreach (var line in descriptionLines)
{
sb.AppendWithIndent(indentSpaces, "/// ");
sb.Append(line.Trim());
sb.AppendLine();
}
sb.AppendWithIndent(indentSpaces, "/// </summary>\r\n");
}
}
public static void ClassFooter(StringBuilder sb)
{
sb.AppendWithIndent(4, "}");
sb.AppendLine();
}
public static void ClassHeader(StringBuilder sb, string name)
{
sb.AppendWithIndent(4, "public class ");
sb.Append(name);
sb.AppendLine();
sb.AppendWithIndent(4, "{");
sb.AppendLine();
}
public static void EnumHeader(StringBuilder sb, string name)
{
sb.AppendWithIndent(4, "public enum ");
sb.Append(name);
sb.AppendLine();
sb.AppendWithIndent(4, "{");
sb.AppendLine();
}
public static void UsingHeader(StringBuilder sb, string namespaceValue, params string[] usings)
{
sb.AppendLine("using System;");
foreach (var value in usings)
{
sb.AppendFormat("using {0};", value);
sb.AppendLine();
}
sb.AppendLine();
sb.Append("namespace ");
sb.Append(namespaceValue);
sb.AppendLine();
sb.AppendLine("{");
}
public static void UsingFooter(StringBuilder sb)
{
sb.Append("}");
}
public static string GetDataType(string responseType)
{
if (responseType.StartsWith("list("))
{
return GetCSharpType(responseType.Substring(5, responseType.Length - 6)) + "[]";
}
if (responseType.StartsWith("set("))
{
return GetCSharpType(responseType.Substring(4, responseType.Length - 5)) + "[]";
}
return GetCSharpType(responseType);
}
private static string GetCSharpType(string responseType)
{
switch (responseType)
{
case "i64":
return "long";
case "i32":
return "int";
case "dateTime":
return "DateTime";
default:
return responseType;
}
}
}
}
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoBet.ApiGenerator.Extensions
{
internal static class StringBuilderExtensions
{
public static void AppendWithIndent(this StringBuilder sb, int spaces, string value = null)
{
for (var i = 0; i < spaces; i++)
{
sb.Append(" ");
}
if(value != null)
{
sb.Append(value);
}
}
}
}
+40
View File
@@ -0,0 +1,40 @@
using System;
namespace AutoBet.ApiGenerator
{
public static class Program
{
private static string _inputXmlFile;
private static string _outputFilesDirectory;
static void Main(string[] args)
{
//ProccessArguments(args);
//var namespaceValue = "SuccessfulCode.BetfairApi";
//var clientName = "Betting";
////var apiClientGenerator = new ApiClientGenetaor(_inputXmlFile, _outputFilesDirectory);
////apiClientGenerator.Process(clientName, namespaceValue);
////var apiClassesGenerator = new ApiClassessGenerator(_inputXmlFile, _outputFilesDirectory);
////apiClassesGenerator.Process(namespaceValue, clientName + "Models");
////var apiEnumsGenerator = new ApiEnumsGenerator(_inputXmlFile, _outputFilesDirectory);
////apiEnumsGenerator.Process(namespaceValue, clientName + "Models", "Enums");
}
private static void ProccessArguments(string[] args)
{
for (var i = 0; i < args.Length; i++)
{
switch (args[i])
{
case "-i":
_inputXmlFile = args[++i];
break;
case "-d":
_outputFilesDirectory = args[++i];
break;
}
}
}
}
}
@@ -0,0 +1,8 @@
{
"profiles": {
"AutoBet.ApiGenerator": {
"commandName": "Project",
"commandLineArgs": "-i \"E:\\Betfair\\bettingapi.xml\" -d \"C:\\Users\\Martin\\Documents\\Visual Studio 2017\\Projects\\AutoBet\\SuccessfulCode.BetfairApi\""
}
}
}