forked from ehn-dcc-development/eu-dcc-business-rules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinternals.dart
46 lines (42 loc) · 2.41 KB
/
internals.dart
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
import 'package:certlogic_dart/src/typings.dart';
class CertLogicInternals {
static bool isFalsy(dynamic value) =>
value == false ||
value == null ||
(value is String && value.isEmpty) ||
(value is num && value == 0) ||
(value is Iterable && value.isEmpty) ||
(value is Map && value.isEmpty);
static bool isTruthy(dynamic value) => !isFalsy(value);
/// NOTE:
/// Effectively, any date is always converted to the corresponding ms-precise date-time
/// at midnight of that date. Note that that doesn't properly reflect the resolution of
/// the input date. That effect has to be taken into account by the logic implementor.
static DateTime dateFromString(String str) {
DateTime? dateTime;
if (str.length == 10) {
// No TZ is added
final date = DateTime.parse(str);
dateTime = DateTime.utc(date.year, date.month, date.day); // Set it to midnight as per specs
}
final regex = r'(^[T,\-,:,\.0-9]{10,}[+,-])([0-9]|[0-9]{3}|[0-9]:[0-9]{2})$';
str = str.replaceAllMapped(RegExp(regex), (match) => '${match.group(1)}0${match.group(2)}');
dateTime ??= DateTime.parse(str);
return DateTime.utc(dateTime.year, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);
}
static DateTime plusTime(String dateTimeLikeStr, int amount, CertLogicTimeUnit unit) {
final dateTime = dateFromString(dateTimeLikeStr);
switch (unit) {
case CertLogicTimeUnit.HOUR:
return DateTime.utc(dateTime.year, dateTime.month, dateTime.day, dateTime.hour + amount, dateTime.minute, dateTime.second, dateTime.millisecond);
case CertLogicTimeUnit.DAY:
return DateTime.utc(dateTime.year, dateTime.month, dateTime.day + amount, dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);
case CertLogicTimeUnit.MONTH:
return DateTime.utc(dateTime.year, dateTime.month + amount, dateTime.day, dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);
case CertLogicTimeUnit.YEAR:
if (dateTime.month == DateTime.february && dateTime.day == 29)
return DateTime.utc(dateTime.year + amount, dateTime.month, dateTime.day - 1, dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);
return DateTime.utc(dateTime.year + amount, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);
}
}
}