public override void Write(Utf8JsonWriter writer, TokenResponse value, JsonSerializerOptions options)
 {
     writer.WriteStartObject();
     writer.WriteString("access_token", value.AccessToken);
     writer.WriteNumber("expires_in", Math.Floor((value.ExpiresAt - DateTime.UtcNow).TotalSeconds));
     writer.WriteString("token_type", TokenResponse.TokenType);
     writer.WriteString("scope", ScopeUtility.ToScopeString(value.Scope));
     writer.WriteString("refresh_token", value.RefreshToken);
     writer.WriteEndObject();
 }
        public override TokenResponse Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType != JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var tokenResponse = new TokenResponse();

            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.PropertyName)
                {
                    var propertyName = reader.ValueSpan;

                    if (!reader.Read())
                    {
                        throw new JsonException();
                    }

                    if (propertyName.SequenceEqual(ACCESS_TOKEN))
                    {
                        tokenResponse.AccessToken = reader.GetString();
                    }
                    else if (propertyName.SequenceEqual(REFRESH_TOKEN))
                    {
                        tokenResponse.RefreshToken = reader.GetString();
                    }
                    else if (propertyName.SequenceEqual(EXPIRES_IN))
                    {
                        tokenResponse.ExpiresAt = DateTime.UtcNow.AddSeconds(reader.GetInt32());
                    }
                    else if (propertyName.SequenceEqual(SCOPE))
                    {
                        tokenResponse.Scope = ScopeUtility.ParseScopeString(reader.GetString());
                    }
                }
                else if (reader.TokenType == JsonTokenType.EndObject)
                {
                    return(tokenResponse);
                }
            }

            throw new JsonException();
        }