diff --git a/ModLinks.cs b/ModLinks.cs index 9e03114..406cccb 100644 --- a/ModLinks.cs +++ b/ModLinks.cs @@ -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; @@ -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 @@ -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 @@ -78,7 +75,7 @@ public IEnumerable AsEnumerable() } } -public record Link +public record Link : IXmlSerializable { [XmlAttribute] public string SHA256 = null!; @@ -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] diff --git a/Program.cs b/Program.cs index 94cd95b..059b4b5 100755 --- a/Program.cs +++ b/Program.cs @@ -53,14 +53,6 @@ private static async Task 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 Main(string[] args) { var sw = new Stopwatch(); @@ -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); } @@ -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) @@ -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;