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