1 module sbin.stdtypesrh;
2 
3 import sbin.repr;
4 import sbin.type;
5 
6 public import sbin.repr : CombineReprHandler;
7 
8 import std.datetime : SysTime, UTC;
9 import std.bitmanip : BitArray;
10 
11 struct SysTimeAsHNSecsRH(bool asUTC=false)
12 {
13     enum sbinReprHandler;
14 static:
15     struct R { long value; }
16 
17     R repr(in SysTime v)
18     {
19         static if (asUTC) return R(v.toUTC.stdTime);
20         else return R(v.stdTime);
21     }
22 
23     SysTime fromRepr(in R r)
24     {
25         static if (asUTC) return SysTime(r.value, UTC());
26         else return SysTime(r.value);
27     }
28 }
29 
30 struct SysTimeAsUnixTimeRH(bool asUTC=false, bool use32bit=false)
31 {
32     enum sbinReprHandler;
33 static:
34     static if (use32bit) alias T = int;
35     else alias T = long;
36 
37     struct R { T value; }
38 
39     R repr(in SysTime v)
40     {
41         static if (asUTC) return R(v.toUTC.toUnixTime!T);
42         else return R(v.toUnixTime!T);
43     }
44 
45     SysTime fromRepr(in R r)
46     {
47         static if (asUTC) return SysTime.fromUnixTime(r.value, UTC());
48         else return SysTime.fromUnixTime(r.value);
49     }
50 }
51 
52 struct BitArrayRH
53 {
54     enum sbinReprHandler;
55 static:
56     struct R
57     {
58         vluint bits;
59         const(void)[] data;
60     }
61 
62     R repr(in BitArray v) { return R(vluint(v.length), cast(const(void)[])v); }
63 
64     BitArray fromRepr(in R r) { return BitArray(r.data.dup, cast(size_t)r.bits.value); }
65 }
66 
67 static if (__VERSION__ >= 2097)
68 {
69     import std.typecons : Nullable;
70     static import std.sumtype;
71 
72     struct NullableAsSumTypeRH
73     {
74         enum sbinReprHandler;
75     static:
76         alias ST = std.sumtype.SumType;
77 
78         auto repr(N)(in N n)
79             if (is(N == Nullable!X, X))
80         {
81             alias R = ST!(typeof(null), typeof(N.init.get));
82             return n.isNull ? R(null) : R(n.get);
83         }
84 
85         auto fromRepr(N)(in N n)
86             if (is(N == ST!X, X...) && X.length == 2 && is(X[0] == typeof(null)))
87         {
88             alias R = Nullable!(N.Types[1]);
89             return n.match!(
90                 (typeof(null) v) => R.init,
91                 v => R(v)
92             );
93         }
94     }
95 }