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 }