using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Deploymentcenter.Client.Models
{
///
/// Liest Wahrheitswerte, die nicht als JSON-Boolean ankommen.
///
/// Die Deploymentcenter-API reicht Release-Zeilen unveraendert aus MySQL
/// durch. is_critical ist dort TINYINT(1) und erscheint je nach
/// PDO-Einstellung als 1, "1" oder true. Der Standardkonverter von
/// System.Text.Json wirft bei allem ausser true/false - und der Fehler
/// haette den gesamten Release-Datensatz unbrauchbar gemacht.
///
public class FlexibleBoolConverter : JsonConverter
{
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
switch (reader.TokenType)
{
case JsonTokenType.True:
return true;
case JsonTokenType.False:
case JsonTokenType.Null:
return false;
case JsonTokenType.Number:
return reader.TryGetInt64(out long number) ? number != 0 : reader.GetDouble() != 0d;
case JsonTokenType.String:
string? value = reader.GetString();
if (string.IsNullOrWhiteSpace(value))
return false;
value = value!.Trim();
if (bool.TryParse(value, out bool parsed))
return parsed;
if (long.TryParse(value, out long numeric))
return numeric != 0;
return value.Equals("yes", StringComparison.OrdinalIgnoreCase)
|| value.Equals("on", StringComparison.OrdinalIgnoreCase);
default:
return false;
}
}
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
{
writer.WriteBooleanValue(value);
}
}
}