-
Notifications
You must be signed in to change notification settings - Fork 446
/
Copy pathHttpApiSettings.cs
175 lines (158 loc) · 5.97 KB
/
HttpApiSettings.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using NJsonSchema;
using NJsonSchema.CodeGeneration.CSharp;
using NSwag;
using NSwag.CodeGeneration;
using NSwag.CodeGeneration.CSharp;
using NSwag.CodeGeneration.CSharp.Models;
using NSwag.CodeGeneration.OperationNameGenerators;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace WebApiClientCore.OpenApi.SourceGenerator
{
/// <summary>
/// 表示WebApiClientCore接口设置模型
/// </summary>
public class HttpApiSettings : CSharpControllerGeneratorSettings
{
/// <summary>
/// 获取或设置命名空间
/// </summary>
public string NameSpace { get; set; } = "WebApiClientCore";
/// <summary>
/// WebApiClient接口设置模型
/// </summary>
public HttpApiSettings()
{
this.ResponseArrayType = "List";
this.ResponseDictionaryType = "Dictionary";
this.ParameterArrayType = "IEnumerable";
this.ParameterDictionaryType = "IDictionary";
this.OperationNameGenerator = new OperationNameProvider();
this.ParameterNameGenerator = new ParameterNameProvider();
this.CSharpGeneratorSettings.TypeNameGenerator = new TypeNameProvider();
this.CSharpGeneratorSettings.ClassStyle = CSharpClassStyle.Poco;
this.CSharpGeneratorSettings.GenerateJsonMethods = false;
this.RouteNamingStrategy = CSharpControllerRouteNamingStrategy.OperationId;
}
/// <summary>
/// 方法名称提供者
/// </summary>
private class OperationNameProvider : MultipleClientsFromOperationIdOperationNameGenerator
{
/// <summary>
/// 获取方法对应的类名
/// </summary>
/// <param name="document"></param>
/// <param name="path"></param>
/// <param name="httpMethod"></param>
/// <param name="operation"></param>
/// <returns></returns>
public override string? GetClientName(OpenApiDocument document, string path, string httpMethod, OpenApiOperation operation)
{
return operation.Tags.FirstOrDefault();
}
}
/// <summary>
/// 参数名提供者
/// </summary>
private class ParameterNameProvider : IParameterNameGenerator
{
/// <summary>
/// 生成参数名
/// </summary>
/// <param name="parameter"></param>
/// <param name="allParameters"></param>
/// <returns></returns>
public string Generate(OpenApiParameter parameter, IEnumerable<OpenApiParameter> allParameters)
{
if (string.IsNullOrEmpty(parameter.Name))
{
return "unnamed";
}
var variableName = CamelCase(parameter.Name
.Replace("-", "_")
.Replace(".", "_")
.Replace(" ", null)
.Replace("$", string.Empty)
.Replace("[", string.Empty)
.Replace("]", string.Empty));
if (allParameters.Count(p => p.Name == parameter.Name) > 1)
{
return variableName + parameter.Kind;
}
return variableName;
}
/// <summary>
/// 骆驼命名
/// </summary>
/// <param name="name">名称</param>
/// <returns></returns>
private static string CamelCase(string name)
{
if (string.IsNullOrEmpty(name) || char.IsUpper(name[0]) == false)
{
return name;
}
var charArray = name.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
if (i == 1 && char.IsUpper(charArray[i]) == false)
{
break;
}
var hasNext = (i + 1 < charArray.Length);
if (i > 0 && hasNext && !char.IsUpper(charArray[i + 1]))
{
if (char.IsSeparator(charArray[i + 1]))
{
charArray[i] = char.ToLowerInvariant(charArray[i]);
}
break;
}
charArray[i] = char.ToLowerInvariant(charArray[i]);
}
return new string(charArray);
}
}
/// <summary>
/// 类型名称提供者
/// </summary>
private class TypeNameProvider : DefaultTypeNameGenerator
{
public override string Generate(JsonSchema schema, string typeNameHint, IEnumerable<string> reservedTypeNames)
{
var prettyName = PrettyName(typeNameHint);
var typeName = base.Generate(schema, prettyName, reservedTypeNames);
return typeName;
}
/// <summary>
/// 美化类型名称
/// </summary>
/// <param name="name">名称</param>
/// <returns></returns>
private static string PrettyName(string name)
{
if (string.IsNullOrEmpty(name) == true)
{
return name;
}
if (name.Contains("[]") == true)
{
name = name.Replace("[]", "Array");
}
var matchs = Regex.Matches(name, @"\W");
if (matchs.Count == 0 || matchs.Count % 2 > 0)
{
return name;
}
var index = -1;
return Regex.Replace(name, @"\W", m =>
{
index++;
return index < matchs.Count / 2 ? "Of" : null;
});
}
}
}
}