1 module logdefer.time.utils;
2 
3 import logdefer.time.duration : Seconds, Millis, Micros, Nanos;
4 import unixtime : UnixTime, UnixTimeHiRes;
5 
6 
7 pure UnixTimeHiRes toUnixTimeHiRes(ADuration)(const ADuration aDuration)
8 {
9     static if (is(ADuration == Seconds))
10     {
11         return UnixTimeHiRes(aDuration.value, 0);
12     }
13     else static if (is(ADuration == Millis))
14     {
15         return UnixTimeHiRes(aDuration.value / 1_000, aDuration.value % 1_000 * 1_000_000);
16     }
17     else static if (is(ADuration == Micros))
18     {
19         return UnixTimeHiRes(aDuration.value / 1_000_000, aDuration.value % 1_000_000 * 1_000);
20     }
21     else static if (is(ADuration == Nanos))
22     {
23         return UnixTimeHiRes(aDuration.value / 1_000_000_000, aDuration.value % 1_000_000_000);
24     }
25     else
26     {
27         static assert(false, "Unknown duration");
28     }
29 }
30 
31 pure UnixTime toUnixTime(ADuration)(const ADuration aDuration)
32 {
33     static if (is(ADuration == Seconds))
34     {
35         return UnixTime(aDuration.value);
36     }
37     else static if (is(ADuration == Millis))
38     {
39         return UnixTime(aDuration.value / 1_000);
40     }
41     else static if (is(ADuration == Micros))
42     {
43         return UnixTime(aDuration.value / 1_000_000);
44     }
45     else static if (is(ADuration == Nanos))
46     {
47         return UnixTime(aDuration.value / 1_000_000_000);
48     }
49     else
50     {
51         static assert(false, "Unknown duration");
52     }
53 }
54 
55 pure ADuration toDuration(ADuration)(const UnixTimeHiRes start, const UnixTimeHiRes end)
56 {
57     return (end - start).toDuration!ADuration();
58 }
59 
60 pure ADuration toDuration(ADuration)(const UnixTime start, const UnixTime end)
61 {
62     return (end - start).toDuration!ADuration();
63 }
64 
65 pure ADuration toDuration(ADuration)(const UnixTimeHiRes timestamp)
66 {
67     static if (is(ADuration == Seconds))
68     {
69         return Seconds(timestamp.seconds);
70     }
71     else static if (is(ADuration == Millis))
72     {
73         return Millis(timestamp.seconds * 1_000 + timestamp.nanos / 1_000_000);
74     }
75     else static if (is(ADuration == Micros))
76     {
77         return Micros(timestamp.seconds * 1_000_000 + timestamp.nanos / 1_000);
78     }
79     else static if (is(ADuration == Nanos))
80     {
81         return Nanos(timestamp.seconds * 1_000_000_000 + timestamp.nanos);
82     }
83     else
84     {
85         static assert(false, "Unknown duration");
86     }
87 }
88 
89 pure ADuration toDuration(ADuration)(const UnixTime timestamp)
90 {
91     static if (is(ADuration == Seconds))
92     {
93         return Seconds(timestamp.seconds);
94     }
95     else static if (is(ADuration == Millis))
96     {
97         return Millis(timestamp.seconds * 1_000);
98     }
99     else static if (is(ADuration == Micros))
100     {
101         return Micros(timestamp.seconds * 1_000_000);
102     }
103     else static if (is(ADuration == Nanos))
104     {
105         return Nanos(timestamp.seconds * 1_000_000_000);
106     }
107     else
108     {
109         static assert(false, "Unknown duration");
110     }
111 }
112 
113 version(unittest)
114 {
115     import std.stdio : writeln;
116 }
117 
118 unittest
119 {
120     writeln("[UnitTest utils] - toUnixTimeHiRes]");
121 
122     // Nanos
123     assert(Nanos(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0));
124     assert(Nanos(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1));
125     assert(Nanos(999_999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_999_999));
126     assert(Nanos(1_000_000_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0));
127     assert(Nanos(1_000_000_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1));
128     assert(Nanos(79_231_938_229).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_938_229));
129 
130     assert(Nanos(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1));
131     assert(Nanos(-999_999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_999_999));
132     assert(Nanos(-1_000_000_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0));
133     assert(Nanos(-1_000_000_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1));
134     assert(Nanos(-79_231_938_229).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_938_229));
135 
136     // Micros
137     assert(Micros(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0));
138     assert(Micros(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1_000));
139     assert(Micros(999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_999_000));
140     assert(Micros(1_000_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0));
141     assert(Micros(1_000_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1_000));
142     assert(Micros(79_231_938).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_938_000));
143 
144     assert(Micros(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1_000));
145     assert(Micros(-999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_999_000));
146     assert(Micros(-1_000_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0));
147     assert(Micros(-1_000_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1_000));
148     assert(Micros(-79_231_938).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_938_000));
149 
150     // Millis
151     assert(Millis(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0));
152     assert(Millis(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1_000_000));
153     assert(Millis(999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_000_000));
154     assert(Millis(1_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0));
155     assert(Millis(1_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1_000_000));
156     assert(Millis(79_231).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_000_000));
157 
158     assert(Millis(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1_000_000));
159     assert(Millis(-999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_000_000));
160     assert(Millis(-1_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0));
161     assert(Millis(-1_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1_000_000));
162     assert(Millis(-79_231).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_000_000));
163 
164     // Seconds
165     assert(Seconds(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0));
166     assert(Seconds(1).toUnixTimeHiRes() == UnixTimeHiRes(1, 0));
167     assert(Seconds(999).toUnixTimeHiRes() == UnixTimeHiRes(999, 0));
168     assert(Seconds(-1).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0));
169     assert(Seconds(-999).toUnixTimeHiRes() == UnixTimeHiRes(-999, 0));
170 }
171 
172 unittest
173 {
174     writeln("[UnitTest utils] - toUnixTime");
175 
176     // Nanos
177     assert(Nanos(0).toUnixTime() == UnixTime(0));
178     assert(Nanos(1).toUnixTime() == UnixTime(0));
179     assert(Nanos(999_999_999).toUnixTime() == UnixTime(0));
180     assert(Nanos(1_000_000_000).toUnixTime() == UnixTime(1));
181     assert(Nanos(1_000_000_001).toUnixTime() == UnixTime(1));
182     assert(Nanos(79_231_938_229).toUnixTime() == UnixTime(79));
183 
184     assert(Nanos(-1).toUnixTime() == UnixTime(0));
185     assert(Nanos(-999_999_999).toUnixTime() == UnixTime(0));
186     assert(Nanos(-1_000_000_000).toUnixTime() == UnixTime(-1));
187     assert(Nanos(-1_000_000_001).toUnixTime() == UnixTime(-1));
188     assert(Nanos(-79_231_938_229).toUnixTime() == UnixTime(-79));
189 
190     // Micros
191     assert(Micros(0).toUnixTime() == UnixTime(0));
192     assert(Micros(1).toUnixTime() == UnixTime(0));
193     assert(Micros(999_999).toUnixTime() == UnixTime(0));
194     assert(Micros(1_000_000).toUnixTime() == UnixTime(1));
195     assert(Micros(1_000_001).toUnixTime() == UnixTime(1));
196     assert(Micros(79_231_938).toUnixTime() == UnixTime(79));
197 
198     assert(Micros(-1).toUnixTime() == UnixTime(0));
199     assert(Micros(-999_999).toUnixTime() == UnixTime(0));
200     assert(Micros(-1_000_000).toUnixTime() == UnixTime(-1));
201     assert(Micros(-1_000_001).toUnixTime() == UnixTime(-1));
202     assert(Micros(-79_231_938).toUnixTime() == UnixTime(-79));
203 
204     // Millis
205     assert(Millis(0).toUnixTime() == UnixTime(0));
206     assert(Millis(1).toUnixTime() == UnixTime(0));
207     assert(Millis(999).toUnixTime() == UnixTime(0));
208     assert(Millis(1_000).toUnixTime() == UnixTime(1));
209     assert(Millis(1_001).toUnixTime() == UnixTime(1));
210     assert(Millis(79_231).toUnixTime() == UnixTime(79));
211 
212     assert(Millis(-1).toUnixTime() == UnixTime(0));
213     assert(Millis(-999).toUnixTime() == UnixTime(0));
214     assert(Millis(-1_000).toUnixTime() == UnixTime(-1));
215     assert(Millis(-1_001).toUnixTime() == UnixTime(-1));
216     assert(Millis(-79_231).toUnixTime() == UnixTime(-79));
217 
218     // Seconds
219     assert(Seconds(0).toUnixTime() == UnixTime(0));
220     assert(Seconds(1).toUnixTime() == UnixTime(1));
221     assert(Seconds(999).toUnixTime() == UnixTime(999));
222 
223     assert(Seconds(-1).toUnixTime() == UnixTime(-1));
224     assert(Seconds(-999).toUnixTime() == UnixTime(-999));
225 }