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(); 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); } } }