Files
lunch-games/source/toml/datetime.d
2025-04-29 01:59:15 +02:00

75 lines
1.9 KiB
D

// Written in the D programming language.
/**
*
* Custom types for TOML's datetimes that add fractional time to D ones.
*
* License: $(HTTP https://github.com/Kripth/toml/blob/master/LICENSE, MIT)
* Authors: Kripth
* References: $(LINK https://github.com/toml-lang/toml/blob/master/README.md)
* Source: $(HTTP https://github.com/Kripth/toml/blob/master/src/toml/datetime.d, toml/_datetime.d)
*
*/
module toml.datetime;
import std.conv : to;
import std.datetime : Duration, dur, DateTimeD = DateTime, Date, TimeOfDayD = TimeOfDay;
struct DateTime {
public Date date;
public TimeOfDay timeOfDay;
@safe:
public pure inout @property DateTimeD dateTime() {
return DateTimeD(this.date, this.timeOfDay.timeOfDay);
}
alias dateTime this;
public static pure DateTime fromISOExtString(scope const(char)[] str) {
Duration frac;
if (str.length > 19 && str[19] == '.') {
frac = dur!"msecs"(to!ulong(str[20 .. $]));
str = str[0 .. 19];
}
auto dt = DateTimeD.fromISOExtString(str);
return DateTime(dt.date, TimeOfDay(dt.timeOfDay, frac));
}
public pure inout string toISOExtString() scope {
return this.date.toISOExtString() ~ "T" ~ this.timeOfDay.toString();
}
}
struct TimeOfDay {
public TimeOfDayD timeOfDay;
public Duration fracSecs;
@safe:
alias timeOfDay this;
public static pure TimeOfDay fromISOExtString(scope const(char)[] str) {
Duration frac;
if (str.length > 8 && str[8] == '.') {
frac = dur!"msecs"(to!ulong(str[9 .. $]));
str = str[0 .. 8];
}
return TimeOfDay(TimeOfDayD.fromISOExtString(str), frac);
}
public pure inout string toISOExtString() scope {
immutable msecs = this.fracSecs.total!"msecs";
if (msecs != 0) {
return this.timeOfDay.toISOExtString() ~ "." ~ to!string(msecs);
} else {
return this.timeOfDay.toISOExtString();
}
}
}