1 module autowrap.csharp.common;
2 
3 public import std.datetime : DateTime, SysTime, Date, TimeOfDay, Duration, TimeZone;
4 public import std.traits : Unqual;
5 
6 public enum isDateTimeType(T) = is(T == Unqual!Date) || is(T == Unqual!DateTime) || is(T == Unqual!SysTime) || is(T == Unqual!TimeOfDay) || is(T == Unqual!Duration) || is(T == Unqual!TimeZone);
7 public enum isDateTimeArrayType(T) = is(T == Unqual!(Date[])) || is(T == Unqual!(DateTime[])) || is(T == Unqual!(SysTime[])) || is(T == Unqual!(TimeOfDay[])) || is(T == Unqual!(Duration[])) || is(T == Unqual!(TimeZone[]));
8 
9 enum string[] excludedMethods = ["toHash", "opEquals", "opCmp", "factory", "__ctor"];
10 
11 public struct LibraryName {
12     string value;
13 }
14 
15 public struct RootNamespace {
16     string value;
17 }
18 
19 public struct OutputFileName {
20     string value;
21 }
22 
23 package string getDLangInterfaceType(T)() {
24     import std.traits : fullyQualifiedName;
25     import std.datetime : DateTime, SysTime, Date, TimeOfDay, Duration;
26     if (isDateTimeType!T) {
27         return "datetime";
28     } else if (isDateTimeArrayType!T) {
29         return "datetime[]";
30     } else {
31         return fullyQualifiedName!T;
32     }
33 }
34 
35 package string getDLangInterfaceName(string moduleName, string aggName, string funcName) {
36     import std.algorithm : map;
37     import std.string : split;
38     import std.array : join;
39 
40     string name = "autowrap_csharp_";
41     name ~= moduleName.split(".").map!camelToPascalCase.join("_");
42 
43     if (aggName != string.init) {
44         name ~= camelToPascalCase(aggName) ~ "_";
45     }
46     name ~= camelToPascalCase(funcName);
47     return name;
48 }
49 
50 package string getDLangInterfaceName(string fqn, string funcName) {
51     import std.algorithm : map;
52     import std.string : split;
53     import std.array : join;
54     string name = "autowrap_csharp_";
55 
56     name ~= fqn.split(".").map!camelToPascalCase.join("_");
57     name ~= camelToPascalCase(funcName);
58     return name;
59 }
60 
61 package string getDLangSliceInterfaceName(string fqn, string funcName) {
62     import std.algorithm : map, among;
63     import std.string : split;
64     import std.array : join;
65 
66     string name = "autowrap_csharp_slice_";
67 
68     if (fqn.among("core.time.Duration", "std.datetime.systime.SysTime", "std.datetime.date.DateTime", "autowrap.csharp.dlang.datetime")) {
69         fqn = "Autowrap_Csharp_Boilerplate_Datetime";
70     }
71 
72     name ~= fqn.split(".").map!camelToPascalCase.join("_");
73     name ~= camelToPascalCase(funcName);
74     return name;
75 }
76 
77 public string camelToPascalCase(string camel) {
78     import std.uni : toUpper;
79     import std.conv : to;
80     return to!string(camel[0].toUpper) ~ camel[1..$];
81 }