Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ jobs:
with:
name: sync-artifacts
path: |
v1/*.json
v2/*.json
ci/v1/*.json
ci/v2/*.json
sync.log

- name: Capture error log
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -370,3 +370,6 @@ docs/README.md

# Ignore OpenAPI documents
docs/openapi/*.json

# Ignore CI files
/ci/
19 changes: 10 additions & 9 deletions src/Helldivers-2-CI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,17 @@ await Task.WhenAll([
var dispatchesv2 = await app.Services.GetRequiredService<IStore<Helldivers.Models.V2.Dispatch, int>>().AllAsync(maxRuntime.Token);
var store = await app.Services.GetRequiredService<IStore<SpaceStation, long>>().AllAsync(maxRuntime.Token);

Directory.CreateDirectory("v1");
Directory.CreateDirectory("v2");
Directory.CreateDirectory("ci");
Directory.CreateDirectory("ci/v1");
Directory.CreateDirectory("ci/v2");

var options = new JsonSerializerOptions { WriteIndented = true };
await File.WriteAllBytesAsync("v1/assignments.json", JsonSerializer.SerializeToUtf8Bytes(assignments, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v1/campaigns.json", JsonSerializer.SerializeToUtf8Bytes(campaigns, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v1/dispatches.json", JsonSerializer.SerializeToUtf8Bytes(dispatchesv1, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v1/planets.json", JsonSerializer.SerializeToUtf8Bytes(planets, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v1/war.json", JsonSerializer.SerializeToUtf8Bytes(war, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v2/dispatches.json", JsonSerializer.SerializeToUtf8Bytes(dispatchesv2, options), maxRuntime.Token);
await File.WriteAllBytesAsync("v2/space-stations.json", JsonSerializer.SerializeToUtf8Bytes(store, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v1/assignments.json", JsonSerializer.SerializeToUtf8Bytes(assignments, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v1/campaigns.json", JsonSerializer.SerializeToUtf8Bytes(campaigns, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v1/dispatches.json", JsonSerializer.SerializeToUtf8Bytes(dispatchesv1, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v1/planets.json", JsonSerializer.SerializeToUtf8Bytes(planets, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v1/war.json", JsonSerializer.SerializeToUtf8Bytes(war, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v2/dispatches.json", JsonSerializer.SerializeToUtf8Bytes(dispatchesv2, options), maxRuntime.Token);
await File.WriteAllBytesAsync("ci/v2/space-stations.json", JsonSerializer.SerializeToUtf8Bytes(store, options), maxRuntime.Token);

return 0;
2 changes: 1 addition & 1 deletion src/Helldivers-2-Models/json
21 changes: 21 additions & 0 deletions src/Helldivers-2-SourceGen/Parsers/BaseJsonParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ public abstract class BaseJsonParser : IJsonParser
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
using global::System.Collections.Generic;
using global::Helldivers.Models.Domain.Localization;
using global::System.CodeDom.Compiler;

namespace Helldivers.Models;

public static partial class Static
{{
/// <summary>Public list of {0} entries from {1}</summary>
[GeneratedCode(""Helldivers.SourceGen"", ""1.0.0"")]
public static {2} {0} = {3};
}}";

Expand Down Expand Up @@ -48,4 +50,23 @@ public SourceText Parse(AdditionalText file, CancellationToken cancellationToken
/// Convert the JSON string into C# code that can be injected.
/// </summary>
protected abstract (string Type, string Source) Parse(string json);

/// <summary>
/// Escapes the given JSON value so it remains a valid C# string while attempting to preserve formatting.
/// </summary>
protected string EscapeString(string? value)
{
const string tripleQuote = @"""""""";
if (string.IsNullOrWhiteSpace(value))
return string.Empty;

if (value.Contains('\n') || value.Contains('"'))
{
value = value?.Replace("\n", "\n\t\t");

return $"{tripleQuote}\n\t\t{value}\n\t\t{tripleQuote}";
}

return $@"""{value}""";
}
}
2 changes: 1 addition & 1 deletion src/Helldivers-2-SourceGen/Parsers/BiomesParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ protected override (string Type, string Source) Parse(string json)
var builder = new StringBuilder("new Dictionary<string, Helldivers.Models.V1.Planets.Biome>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(json)!;
foreach (var pair in entries)
builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", new Helldivers.Models.V1.Planets.Biome(""{pair.Value["name"]}"", ""{pair.Value["description"]}"") }},");
builder.AppendLine($@"{'\t'}{'\t'}{{ {EscapeString(pair.Key)}, new Helldivers.Models.V1.Planets.Biome({EscapeString(pair.Value["name"])}, {EscapeString(pair.Value["description"])}) }},");

builder.Append("\t}");
return ("IReadOnlyDictionary<string, Helldivers.Models.V1.Planets.Biome>", builder.ToString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ protected override (string Type, string Source) Parse(string json)
var builder = new StringBuilder("new Dictionary<string, Helldivers.Models.V1.Planets.Hazard>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(json)!;
foreach (var pair in entries)
builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", new Helldivers.Models.V1.Planets.Hazard(""{pair.Value["name"]}"", ""{pair.Value["description"]}"") }},");
builder.AppendLine($@"{'\t'}{'\t'}{{ {EscapeString(pair.Key)}, new Helldivers.Models.V1.Planets.Hazard({EscapeString(pair.Value["name"])}, {EscapeString(pair.Value["description"])}) }},");

builder.Append("\t}");
return ("IReadOnlyDictionary<string, Helldivers.Models.V1.Planets.Hazard>", builder.ToString());
Expand Down
2 changes: 1 addition & 1 deletion src/Helldivers-2-SourceGen/Parsers/FactionsParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ protected override (string Type, string Source) Parse(string json)
var builder = new StringBuilder("new Dictionary<int, string>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, string>>(json)!;
foreach (var pair in entries)
builder.AppendLine($@"{'\t'}{'\t'}{{ {pair.Key}, ""{pair.Value}"" }},");
builder.AppendLine($@"{'\t'}{'\t'}{{ {pair.Key}, {EscapeString(pair.Value)} }},");

builder.Append("\t}");
return ("IReadOnlyDictionary<int, string>", builder.ToString());
Expand Down
4 changes: 1 addition & 3 deletions src/Helldivers-2-SourceGen/Parsers/PlanetRegionsParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ protected override (string Type, string Source) Parse(string json)
string? description = property.Value.GetProperty("description").GetString();
if (string.IsNullOrWhiteSpace(description))
description = "null";
else
description = $@"""{description}""";

builder.AppendLine($@"{'\t'}{'\t'}{{ {index}, (""{name}"", {description}) }},");
builder.AppendLine($@"{'\t'}{'\t'}{{ {index}, ({EscapeString(name)}, {EscapeString(description)}) }},");
}

builder.Append("\t}");
Expand Down
4 changes: 2 additions & 2 deletions src/Helldivers-2-SourceGen/Parsers/PlanetsParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ protected override (string Type, string Source) Parse(string json)
.Value
.GetProperty("environmentals")
.EnumerateArray()
.Select(prop => $@"""{prop.GetString()!}""")
.Select(prop => EscapeString(prop.GetString()))
.ToList();

builder.AppendLine($@"{'\t'}{'\t'}{{ {index}, (LocalizedMessage.FromStrings([{string.Join(", ", names.Select(pair => $@"[""{pair.Key}"", ""{pair.Value}""]"))}]), ""{sector}"", ""{biome}"", [{string.Join(", ", environmentals)}]) }},");
builder.AppendLine($@"{'\t'}{'\t'}{{ {index}, (LocalizedMessage.FromStrings([{string.Join(", ", names.Select(pair => $@"[{EscapeString(pair.Key)}, {EscapeString(pair.Value)}]"))}]), {EscapeString(sector)}, {EscapeString(biome)}, [{string.Join(", ", environmentals)}]) }},");
}

builder.Append("\t}");
Expand Down