diff options
Diffstat (limited to 'IrcTokens/Line.cs')
-rw-r--r-- | IrcTokens/Line.cs | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/IrcTokens/Line.cs b/IrcTokens/Line.cs index 9056097..24efe4a 100644 --- a/IrcTokens/Line.cs +++ b/IrcTokens/Line.cs @@ -8,7 +8,7 @@ namespace IrcTokens /// <summary> /// Tools to represent, parse, and format IRC lines /// </summary> - public class Line + public class Line : IEquatable<Line> { public Dictionary<string, string> Tags { get; set; } public string Source { get; set; } @@ -16,32 +16,52 @@ namespace IrcTokens public List<string> Params { get; set; } private Hostmask _hostmask; - private readonly string _rawLine; public override string ToString() { var vars = new List<string>(); if (Command != null) + { vars.Add($"command={Command}"); + } + if (Source != null) + { vars.Add($"source={Source}"); + } + if (Params != null && Params.Any()) + { vars.Add($"params=[{string.Join(",", Params)}]"); + } + if (Tags != null && Tags.Any()) + { vars.Add($"tags=[{string.Join(";", Tags.Select(kvp => $"{kvp.Key}={kvp.Value}"))}]"); + } return $"Line({string.Join(", ", vars)})"; } - public override int GetHashCode() => Format().GetHashCode(StringComparison.Ordinal); + public override int GetHashCode() + { + return Format().GetHashCode(StringComparison.Ordinal); + } - public override bool Equals(object obj) + public bool Equals(Line other) { - if (obj == null || GetType() != obj.GetType()) + if (other == null) + { return false; + } - return Format() == ((Line) obj).Format(); + return Format() == other.Format(); + } + + public override bool Equals(object obj) + { + return Equals(obj as Line); } public Hostmask Hostmask => @@ -56,9 +76,10 @@ namespace IrcTokens public Line(string line) { if (string.IsNullOrWhiteSpace(line)) + { throw new ArgumentNullException(nameof(line)); + } - _rawLine = line; string[] split; if (line.StartsWith('@')) @@ -97,7 +118,7 @@ namespace IrcTokens Params = line.Contains(' ', StringComparison.Ordinal) ? line.Split(' ', StringSplitOptions.RemoveEmptyEntries).ToList() - : new List<string> {line}; + : new List<string> { line }; if (Params[0].StartsWith(':')) { @@ -135,7 +156,9 @@ namespace IrcTokens } if (Source != null) + { outs.Add($":{Source}"); + } outs.Add(Command); @@ -147,14 +170,22 @@ namespace IrcTokens foreach (var p in Params) { if (p.Contains(' ', StringComparison.Ordinal)) + { throw new ArgumentException(@"non-last parameters cannot have spaces", p); + } + if (p.StartsWith(':')) + { throw new ArgumentException(@"non-last parameters cannot start with colon", p); + } } outs.AddRange(Params); if (string.IsNullOrWhiteSpace(last) || last.Contains(' ', StringComparison.Ordinal) || last.StartsWith(':')) + { last = $":{last}"; + } + outs.Add(last); } |