Skip to content
24 changes: 17 additions & 7 deletions ModLinks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace ModlinksShaVerifier;
Expand All @@ -19,7 +21,7 @@ public record Manifest
private Links? _links;
private Link? _link;

public string Name { get; set; } = null!;
public string? Name { get; set; }

[XmlElement]
public Link? Link
Expand All @@ -45,11 +47,6 @@ public override string ToString()
+ $"\t{nameof(Links)}: {(object?) _link ?? Links},\n"
+ "}";
}

public override int GetHashCode()
{
return HashCode.Combine(Name, Links);
}
}

public record Links
Expand Down Expand Up @@ -78,7 +75,7 @@ public IEnumerable<Link> AsEnumerable()
}
}

public record Link
public record Link : IXmlSerializable
{
[XmlAttribute]
public string SHA256 = null!;
Expand All @@ -90,6 +87,19 @@ public override string ToString()
{
return $"[Link: {nameof(SHA256)} = {SHA256}, {nameof(URL)}: {URL}]";
}

public XmlSchema? GetSchema() => null;

public void ReadXml(XmlReader reader)
{
var sha256 = reader.GetAttribute(nameof(SHA256));
SHA256 = sha256 ?? throw new InvalidDataException("SHA256 attribute not found");
URL = reader.ReadElementContentAsString().Trim();
}

public void WriteXml(XmlWriter writer)
{
}
}

[Serializable]
Expand Down
19 changes: 5 additions & 14 deletions Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ private static async Task<bool> CheckSingleSha(Manifest m)
return res.All(x => x);
}

private static void TrimManifest(ref Manifest m)
{
foreach (var link in m.Links.AsEnumerable())
{
link.URL = link.URL.Trim();
}
}

internal static async Task<int> Main(string[] args)
{
var sw = new Stopwatch();
Expand Down Expand Up @@ -101,11 +93,11 @@ await Console.Error.WriteLineAsync(
if (currentReader.NodeType != XmlNodeType.Element)
continue;

if (currentReader.Name != "Manifest")
if (currentReader.Name != nameof(Manifest))
continue;

var currentManifest = (Manifest?)serializer.Deserialize(currentReader) ?? throw new InvalidDataException();
TrimManifest(ref currentManifest);
currentManifest.Name ??= nameof(ApiLinks);
checkedLinksDict.Add(currentManifest.Name, currentManifest.Links);
}

Expand All @@ -116,12 +108,11 @@ await Console.Error.WriteLineAsync(
if (incomingReader.NodeType != XmlNodeType.Element)
continue;

if (incomingReader.Name != "Manifest")
if (incomingReader.Name != nameof(Manifest))
continue;

var incomingManifest = (Manifest?)serializer.Deserialize(incomingReader) ?? throw new InvalidDataException();
TrimManifest(ref incomingManifest);

incomingManifest.Name ??= nameof(ApiLinks);
if (checkedLinksDict.TryGetValue(incomingManifest.Name, out var checkedLinks))
{
if (checkedLinks != incomingManifest.Links)
Expand All @@ -139,7 +130,7 @@ await Console.Error.WriteLineAsync(

sw.Stop();

Console.WriteLine($"Checked {checks.Count} mods in {sw.ElapsedMilliseconds}ms.");
Console.WriteLine($"Checked {checks.Count} manifests in {sw.ElapsedMilliseconds}ms.");

// If they're not all correct, error.
return !res.All(x => x) ? 1 : 0;
Expand Down