Skip to content

Commit 3f19ecb

Browse files
danegstaCopilot
andcommitted
Use JSON serializer for bundle lease metadata
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 9fb24dc commit 3f19ecb

1 file changed

Lines changed: 26 additions & 44 deletions

File tree

src/Shared/BundleVersionLease.cs

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
using System.Diagnostics;
88
using System.Globalization;
9-
using System.Text;
9+
using System.Text.Json;
10+
using System.Text.Json.Serialization;
1011

1112
namespace Aspire.Shared;
1213

@@ -68,9 +69,8 @@ public static BundleVersionLease Acquire(string versionDirectory, string holderK
6869

6970
try
7071
{
71-
var metadata = CreateMetadataJson(fullVersionDirectory, holderKind, commandName);
72-
var bytes = Encoding.UTF8.GetBytes(metadata);
73-
stream.Write(bytes);
72+
var metadata = CreateMetadata(fullVersionDirectory, holderKind, commandName);
73+
JsonSerializer.Serialize(stream, metadata, BundleVersionLeaseJsonSerializerContext.Default.BundleVersionLeaseMetadata);
7474
stream.Flush(flushToDisk: true);
7575

7676
return new BundleVersionLease(fullVersionDirectory, leasePath, stream);
@@ -208,49 +208,31 @@ private static long GetCurrentProcessStartTimeTicks()
208208
}
209209
}
210210

211-
private static string CreateMetadataJson(string versionDirectory, string holderKind, string? commandName)
211+
private static BundleVersionLeaseMetadata CreateMetadata(string versionDirectory, string holderKind, string? commandName)
212212
{
213213
var versionId = Path.GetFileName(versionDirectory.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));
214214
var startTicks = GetCurrentProcessStartTimeTicks();
215-
var acquired = DateTimeOffset.UtcNow.ToString("O", CultureInfo.InvariantCulture);
216215

217-
return $$"""
218-
{
219-
"versionId": "{{EscapeJson(versionId)}}",
220-
"versionDirectory": "{{EscapeJson(versionDirectory)}}",
221-
"processId": {{Environment.ProcessId}},
222-
"processStartTimeUtcTicks": {{startTicks}},
223-
"holderKind": "{{EscapeJson(holderKind)}}",
224-
"commandName": "{{EscapeJson(commandName)}}",
225-
"acquiredUtc": "{{acquired}}"
226-
}
227-
""";
228-
}
229-
230-
private static string EscapeJson(string? value)
231-
{
232-
if (string.IsNullOrEmpty(value))
233-
{
234-
return string.Empty;
235-
}
236-
237-
var builder = new StringBuilder(value.Length);
238-
foreach (var ch in value)
239-
{
240-
_ = ch switch
241-
{
242-
'"' => builder.Append("\\\""),
243-
'\\' => builder.Append("\\\\"),
244-
'\b' => builder.Append("\\b"),
245-
'\f' => builder.Append("\\f"),
246-
'\n' => builder.Append("\\n"),
247-
'\r' => builder.Append("\\r"),
248-
'\t' => builder.Append("\\t"),
249-
< ' ' => builder.Append(CultureInfo.InvariantCulture, $"\\u{(int)ch:x4}"),
250-
_ => builder.Append(ch)
251-
};
252-
}
253-
254-
return builder.ToString();
216+
return new BundleVersionLeaseMetadata(
217+
VersionId: versionId,
218+
VersionDirectory: versionDirectory,
219+
ProcessId: Environment.ProcessId,
220+
ProcessStartTimeUtcTicks: startTicks,
221+
HolderKind: holderKind,
222+
CommandName: commandName,
223+
AcquiredUtc: DateTimeOffset.UtcNow);
255224
}
256225
}
226+
227+
internal sealed record BundleVersionLeaseMetadata(
228+
string? VersionId,
229+
string VersionDirectory,
230+
int ProcessId,
231+
long ProcessStartTimeUtcTicks,
232+
string HolderKind,
233+
string? CommandName,
234+
DateTimeOffset AcquiredUtc);
235+
236+
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, WriteIndented = true)]
237+
[JsonSerializable(typeof(BundleVersionLeaseMetadata))]
238+
internal sealed partial class BundleVersionLeaseJsonSerializerContext : JsonSerializerContext;

0 commit comments

Comments
 (0)