using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using MonoGame.Extended.Graphics;
namespace MonoGame.Extended.Serialization.Json;
///
/// Converts a value to or from JSON.
///
public class NinePatchJsonConverter : JsonConverter
{
private readonly ITextureRegionService _textureRegionService;
///
/// Initializes a new instance of the class.
///
/// The texture region service used to retrieve texture regions.
public NinePatchJsonConverter(ITextureRegionService textureRegionService)
{
_textureRegionService = textureRegionService;
}
///
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(NinePatch);
///
///
/// Thrown if the JSON property does not contain a properly formatted value
///
public override NinePatch Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException($"Expected {nameof(JsonTokenType.StartObject)} token");
}
string padding = string.Empty;
string regionName = string.Empty;
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
break;
}
if (reader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = reader.GetString();
reader.Read();
if (propertyName.Equals("Padding", StringComparison.Ordinal))
{
padding = reader.GetString();
}
else if (propertyName.Equals("TextureRegion", StringComparison.Ordinal))
{
regionName = reader.GetString();
}
}
}
if (string.IsNullOrEmpty(padding) || string.IsNullOrEmpty(regionName))
{
throw new JsonException($"Missing required properties \"Padding\" and \"TextureRegion\"");
}
var thickness = Thickness.Parse(padding);
var region = _textureRegionService.GetTextureRegion(regionName);
return region.CreateNinePatch(thickness);
}
///
///
/// Throw if is .
///
public override void Write(Utf8JsonWriter writer, NinePatch value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
if (value is null)
{
writer.WriteNullValue();
return;
}
writer.WriteStartObject();
writer.WriteString("TextureRegion", value.Name);
writer.WriteString("Padding", value.Padding.ToString());
writer.WriteEndObject();
}
}