diff --git a/IPA.Loader/Config/Stores/Converters.cs b/IPA.Loader/Config/Stores/Converters.cs index 6cd104c4..b5c18a8f 100644 --- a/IPA.Loader/Config/Stores/Converters.cs +++ b/IPA.Loader/Config/Stores/Converters.cs @@ -114,7 +114,8 @@ namespace IPA.Config.Stores.Converters IValConv, IValConv, IValConv, IValConv, IValConv, IValConv, - IValConv + IValConv, IValConv, + IValConv { internal static readonly ValConvImpls Impl = new ValConvImpls(); Type IValConv.Get() => typeof(CharConverter); @@ -133,6 +134,8 @@ namespace IPA.Config.Stores.Converters Type IValConv.Get() => typeof(DecimalConverter); Type IValConv.Get() => typeof(BooleanConverter); Type IValConv.Get() => typeof(DateTimeConverter); + Type IValConv.Get() => typeof(DateTimeOffsetConverter); + Type IValConv.Get() => typeof(TimeSpanConverter); } } @@ -657,7 +660,7 @@ namespace IPA.Config.Stores.Converters public override Value ToValue(bool obj, object parent) => Value.From(obj); } - + internal class DateTimeConverter : ValueConverter { public override DateTime FromValue(Value value, object parent) @@ -677,4 +680,44 @@ namespace IPA.Config.Stores.Converters public override Value ToValue(DateTime obj, object parent) => Value.Text(obj.ToString("O")); } + + internal class DateTimeOffsetConverter : ValueConverter + { + public override DateTimeOffset FromValue(Value value, object parent) + { + if (!(value is Text text)) + { + throw new ArgumentException("Value is not of type Text", nameof(value)); + } + + if (DateTimeOffset.TryParse(text.Value, out var dateTime)) + { + return dateTime; + } + + throw new ArgumentException($"Parsing failed, {text.Value}"); + } + + public override Value ToValue(DateTimeOffset obj, object parent) => Value.Text(obj.ToString("O")); + } + + internal class TimeSpanConverter : ValueConverter + { + public override TimeSpan FromValue(Value value, object parent) + { + if (!(value is Text text)) + { + throw new ArgumentException("Value is not of type Text", nameof(value)); + } + + if (TimeSpan.TryParse(text.Value, out var dateTime)) + { + return dateTime; + } + + throw new ArgumentException($"Parsing failed, {text.Value}"); + } + + public override Value ToValue(TimeSpan obj, object parent) => Value.Text(obj.ToString()); + } }