You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.6 KiB
50 lines
1.6 KiB
9 months ago
|
using System.Reflection;
|
||
|
using System.Text.Json;
|
||
|
using System.Text.Json.Serialization;
|
||
|
using StabilityMatrix.Core.Models.Api.Comfy.NodeTypes;
|
||
|
|
||
|
namespace StabilityMatrix.Core.Converters.Json;
|
||
|
|
||
|
public class NodeConnectionBaseJsonConverter : JsonConverter<NodeConnectionBase>
|
||
|
{
|
||
|
/// <inheritdoc />
|
||
|
public override NodeConnectionBase Read(
|
||
|
ref Utf8JsonReader reader,
|
||
|
Type typeToConvert,
|
||
|
JsonSerializerOptions options
|
||
|
)
|
||
|
{
|
||
|
// Read as Data array
|
||
|
reader.Read();
|
||
|
var data = new object[2];
|
||
|
reader.Read();
|
||
|
data[0] = reader.GetString() ?? throw new JsonException("Expected string for node name");
|
||
|
reader.Read();
|
||
|
data[1] = reader.GetInt32();
|
||
|
reader.Read();
|
||
|
|
||
|
if (Activator.CreateInstance(typeToConvert) is not NodeConnectionBase instance)
|
||
|
{
|
||
|
throw new JsonException($"Failed to create instance of {typeToConvert}");
|
||
|
}
|
||
|
|
||
|
var propertyInfo =
|
||
|
typeToConvert.GetProperty("Data", BindingFlags.Public | BindingFlags.Instance)
|
||
|
?? throw new JsonException($"Failed to get Data property of {typeToConvert}");
|
||
|
|
||
|
propertyInfo.SetValue(instance, data);
|
||
|
|
||
|
return instance;
|
||
|
}
|
||
|
|
||
|
/// <inheritdoc />
|
||
|
public override void Write(Utf8JsonWriter writer, NodeConnectionBase value, JsonSerializerOptions options)
|
||
|
{
|
||
|
// Write as Data array
|
||
|
writer.WriteStartArray();
|
||
|
writer.WriteStringValue(value.Data?[0] as string);
|
||
|
writer.WriteNumberValue((int)value.Data?[1]!);
|
||
|
writer.WriteEndArray();
|
||
|
}
|
||
|
}
|