Atulin / RedditStoryDl

MIT License
0 stars 0 forks source link

Make it work with trimming and NativeAOT #2

Open Atulin opened 8 months ago

Atulin commented 8 months ago

This ought to be helpful, might remove the reliance on JsonNode deserialization:

public record DateTimeOffsetOrBool
{
    private readonly bool? _boolValue;
    private readonly DateTimeOffset? _dateTimeOffsetValue;
    public DateTimeOffsetOrBool( bool value )
    {
        _boolValue = value;
    }

    public DateTimeOffsetOrBool( DateTimeOffset value )
    {
        _dateTimeOffsetValue = value;
    }

    public bool IsBool => _boolValue.HasValue;
    public bool IsDateTimeOffset => _dateTimeOffsetValue.HasValue;

    public bool TryGetBool( out bool value )
    {
        if ( _boolValue.HasValue )
        {
            value = _boolValue.Value;
            return true;
        }
        value = default;
        return false;
    }

    public bool TryGetDateTimeOffset( out DateTimeOffset value )
    {
        if ( _dateTimeOffsetValue.HasValue )
        {
            value = _dateTimeOffsetValue.Value;
            return true;
        }
        value = default;
        return false;
    }

    public override string ToString()
    {
        if ( _boolValue.HasValue ) return _boolValue.Value.ToString();
        if ( _dateTimeOffsetValue.HasValue ) return _dateTimeOffsetValue.Value.ToString();
        return string.Empty;
    }

    public static implicit operator DateTimeOffsetOrBool( bool value )
        => new DateTimeOffsetOrBool( value );

    public static implicit operator DateTimeOffsetOrBool( DateTimeOffset value )
        => new DateTimeOffsetOrBool( value );
}
public class UnixTimestampOrBoolJsonConverter : JsonConverter<DateTimeOffsetOrBool>
{
    public override DateTimeOffsetOrBool? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options )
    {
        switch ( reader.TokenType )
        {
            case JsonTokenType.Number:
                return DateTimeOffset.FromUnixTimeSeconds( reader.GetInt64() );
            case JsonTokenType.True:
                return true;
            case JsonTokenType.False:
                return false;
            default:
                return null;
        }
    }

    public override void Write( Utf8JsonWriter writer, DateTimeOffsetOrBool value, JsonSerializerOptions options )
    {
        if ( value.TryGetBool( out var boolValue ) )
        {
            writer.WriteBooleanValue( boolValue );
        }
        if ( value.TryGetDateTimeOffset( out var dateTimeOffsetValue ) )
        {
            writer.WriteNumberValue( dateTimeOffsetValue.ToUnixTimeSeconds() );
        }
    }
}

Credit: Sir Rufo from C# Discord server