Skip to content

Commit

Permalink
Add json converter for mail carriers
Browse files Browse the repository at this point in the history
  • Loading branch information
sliekens committed Jan 26, 2025
1 parent f8626a6 commit 2d77d59
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using GuildWars2.Tests.TestInfrastructure;
using System.Text.Json;
using GuildWars2.Hero.Equipment.MailCarriers;
using GuildWars2.Tests.TestInfrastructure;

namespace GuildWars2.Tests.Features.Hero.Equipment.MailCarriers;

Expand Down Expand Up @@ -32,6 +34,10 @@ await sut.Hero.Equipment.MailCarriers.GetMailCarriers(
Assert.InRange(mailCarrier.Order, 0, 1000);
Assert.NotEmpty(mailCarrier.IconHref);
Assert.NotEmpty(mailCarrier.Name);

var json = JsonSerializer.Serialize(mailCarrier);
var roundtrip = JsonSerializer.Deserialize<MailCarrier>(json);
Assert.Equal(mailCarrier, roundtrip);
}
);
}
Expand Down
5 changes: 4 additions & 1 deletion GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrier.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
namespace GuildWars2.Hero.Equipment.MailCarriers;
using System.Text.Json.Serialization;

namespace GuildWars2.Hero.Equipment.MailCarriers;

/// <summary>Information about a mail carrier.</summary>
[PublicAPI]
[DataTransferObject]
[JsonConverter(typeof(MailCarrierJsonConverter))]
public sealed record MailCarrier
{
/// <summary>The mail carrier ID.</summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
namespace GuildWars2.Hero.Equipment.MailCarriers;
using System.Text.Json.Serialization;

namespace GuildWars2.Hero.Equipment.MailCarriers;

/// <summary>Modifiers for mail carriers.</summary>
[PublicAPI]
[JsonConverter(typeof(MailCarrierFlagsJsonConverter))]
public sealed record MailCarrierFlags : Flags
{
/// <summary>Whether the mail carrier is the default for new accounts.</summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using GuildWars2.Json;

namespace GuildWars2.Hero.Equipment.MailCarriers;

internal sealed class MailCarrierFlagsJsonConverter : JsonConverter<MailCarrierFlags>
{
public override MailCarrierFlags? Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options
)
{
using var json = JsonDocument.ParseValue(ref reader);
return Read(json.RootElement);
}

public override void Write(
Utf8JsonWriter writer,
MailCarrierFlags value,
JsonSerializerOptions options
)
{
Write(writer, value);
}

public static MailCarrierFlags Read(JsonElement json)
{
return new MailCarrierFlags
{
Default = json.GetProperty("default").GetBoolean(),
Other = json.GetProperty("other").GetList(static value => value.GetStringRequired())
};
}

public static void Write(Utf8JsonWriter writer, MailCarrierFlags value)
{
writer.WriteStartObject();
writer.WriteBoolean("default", value.Default);
writer.WritePropertyName("other");
writer.WriteStartArray();
foreach (var other in value.Other)
{
writer.WriteStringValue(other);
}

writer.WriteEndArray();
writer.WriteEndObject();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using GuildWars2.Json;

namespace GuildWars2.Hero.Equipment.MailCarriers;

internal sealed class MailCarrierJsonConverter : JsonConverter<MailCarrier>
{
public override MailCarrier? Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options
)
{
using var document = JsonDocument.ParseValue(ref reader);
return Read(document.RootElement);
}

public static MailCarrier? Read(JsonElement json)
{
return new MailCarrier
{
Id = json.GetProperty("id").GetInt32(),
UnlockItemIds = json.GetProperty("unlock_item_ids").GetList(entry => entry.GetInt32()),
Order = json.GetProperty("order").GetInt32(),
IconHref = json.GetProperty("icon").GetStringRequired(),
Name = json.GetProperty("name").GetStringRequired(),
Flags = MailCarrierFlagsJsonConverter.Read(json.GetProperty("flags"))
};
}

public override void Write(
Utf8JsonWriter writer,
MailCarrier value,
JsonSerializerOptions options
)
{
writer.WriteStartObject();
writer.WriteNumber("id", value.Id);
writer.WriteStartArray("unlock_item_ids");
foreach (var itemId in value.UnlockItemIds)
{
writer.WriteNumberValue(itemId);
}

writer.WriteEndArray();
writer.WriteNumber("order", value.Order);
writer.WriteString("icon", value.IconHref);
writer.WriteString("name", value.Name);
writer.WritePropertyName("flags");
MailCarrierFlagsJsonConverter.Write(writer, value.Flags);
writer.WriteEndObject();
}
}

0 comments on commit 2d77d59

Please sign in to comment.