Initial commit
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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\""
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user