50 lines
2.4 KiB
C#
50 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Runtime.Serialization;
|
|
|
|
namespace Prophet.CoopWithDsh
|
|
{
|
|
[DataContract]
|
|
internal sealed class OpenDocument
|
|
{
|
|
[DataMember(Name = "path", Order = 1)] public string Path { get; set; } = string.Empty;
|
|
[DataMember(Name = "label", Order = 2)] public string Label { get; set; } = string.Empty;
|
|
[DataMember(Name = "dirty", Order = 3)] public bool Dirty { get; set; }
|
|
}
|
|
|
|
[DataContract]
|
|
internal sealed class OpenFileSnapshot
|
|
{
|
|
[DataMember(Name = "version", Order = 1)] public int Version { get; set; } = 1;
|
|
[DataMember(Name = "instanceId", Order = 2)] public string InstanceId { get; set; } = string.Empty;
|
|
[DataMember(Name = "ide", Order = 3)] public string Ide { get; set; } = "visualstudio";
|
|
[DataMember(Name = "processId", Order = 4)] public int ProcessId { get; set; }
|
|
[DataMember(Name = "workspace", Order = 5, EmitDefaultValue = false)] public string? Workspace { get; set; }
|
|
[DataMember(Name = "updatedAt", Order = 6)] public string UpdatedAt { get; set; } = string.Empty;
|
|
[DataMember(Name = "documents", Order = 7)] public OpenDocument[] Documents { get; set; } = Array.Empty<OpenDocument>();
|
|
}
|
|
|
|
internal static class SnapshotModel
|
|
{
|
|
internal static OpenFileSnapshot Create(string instanceId, int processId, string? workspace, IEnumerable<OpenDocument> documents, DateTimeOffset now)
|
|
{
|
|
var deduplicated = new Dictionary<string, OpenDocument>(StringComparer.OrdinalIgnoreCase);
|
|
foreach (var document in documents.Where(d => !string.IsNullOrWhiteSpace(d.Path) && Path.IsPathRooted(d.Path)))
|
|
{
|
|
if (!deduplicated.TryGetValue(document.Path, out var current) || (!current.Dirty && document.Dirty))
|
|
deduplicated[document.Path] = document;
|
|
}
|
|
return new OpenFileSnapshot
|
|
{
|
|
InstanceId = instanceId,
|
|
ProcessId = processId,
|
|
Workspace = string.IsNullOrWhiteSpace(workspace) ? null : workspace,
|
|
UpdatedAt = now.UtcDateTime.ToString("O"),
|
|
Documents = deduplicated.Values.OrderBy(d => d.Label, StringComparer.OrdinalIgnoreCase).ThenBy(d => d.Path, StringComparer.OrdinalIgnoreCase).ToArray(),
|
|
};
|
|
}
|
|
}
|
|
}
|