Introduced some unit testing. Cleaned up some classes in Beam. Overhauled source link generation.
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Beam {
|
||||
public class Parameter(string name) {
|
||||
public string Name { get; set; } = name;
|
||||
}
|
||||
|
||||
public class LinkSegment(string name, string separator = "", string suffix = "") {
|
||||
public string Name { get; set; } = name;
|
||||
public List<Parameter> Parameters { get; set; } = [];
|
||||
public string Separator { get; set; } = separator;
|
||||
public string Suffix { get; set; } = suffix;
|
||||
}
|
||||
|
||||
public class SourceLinkBuilder(string host, string protocol = "https") {
|
||||
public string Protocol { get; set; } = protocol;
|
||||
public string Host { get; set; } = host;
|
||||
public List<LinkSegment> Segments { get; set; } = [];
|
||||
|
||||
public string GetSuffix(int segmentIndex) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
return Segments[segmentIndex].Suffix;
|
||||
}
|
||||
|
||||
public string GetSuffix()
|
||||
=> GetSuffix(Segments.Count - 1);
|
||||
|
||||
public string GetSeparator(int segmentIndex) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
return Segments[segmentIndex].Separator;
|
||||
}
|
||||
|
||||
public string GetSeparator()
|
||||
=> GetSeparator(Segments.Count - 1);
|
||||
|
||||
public void SetSuffix(int segmentIndex, string suffix) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
var seg = Segments[segmentIndex];
|
||||
seg.Suffix = suffix;
|
||||
}
|
||||
|
||||
public void SetSuffix(string suffix)
|
||||
=> SetSuffix(Segments.Count - 1, suffix);
|
||||
|
||||
public void SetSeparator(int segmentIndex, string separator) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
var seg = Segments[segmentIndex];
|
||||
seg.Separator = separator;
|
||||
}
|
||||
|
||||
public void SetSeparator(string separator)
|
||||
=> SetSeparator(Segments.Count - 1, separator);
|
||||
|
||||
public void AddSegment(string name, string? separator = null) {
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(name);
|
||||
Segments.Add(new LinkSegment(name, separator));
|
||||
}
|
||||
|
||||
public void AddParameters(int segmentIndex, params string[] parameters) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
var seg = Segments[segmentIndex];
|
||||
foreach(var parameter in parameters) {
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(parameter);
|
||||
seg.Parameters.Add(new Parameter(parameter));
|
||||
}
|
||||
}
|
||||
|
||||
public void AddParameters(params string[] parameters)
|
||||
=> AddParameters(Segments.Count - 1, parameters);
|
||||
|
||||
public void SetParameters(int segmentIndex, params string[] parameters) {
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(segmentIndex, Segments.Count);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(segmentIndex);
|
||||
var seg = Segments[segmentIndex];
|
||||
seg.Parameters.Clear();
|
||||
AddParameters(segmentIndex, parameters);
|
||||
}
|
||||
|
||||
public void SetParameters(params string[] parameters)
|
||||
=> SetParameters(Segments.Count - 1, parameters);
|
||||
|
||||
public int GetParameterCount() {
|
||||
int count = 0;
|
||||
foreach(var segment in Segments) {
|
||||
count += segment.Parameters.Count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public SourceLink Build(params object[] parameterValues) {
|
||||
ArgumentOutOfRangeException.ThrowIfNotEqual(parameterValues.Length, GetParameterCount());
|
||||
|
||||
StringBuilder link = new();
|
||||
link.Append(Protocol);
|
||||
link.Append("://");
|
||||
link.Append(Host);
|
||||
int pvC = 0;
|
||||
foreach(var segment in Segments) {
|
||||
link.Append('/');
|
||||
link.Append(segment.Name);
|
||||
for (int i = 0; i < segment.Parameters.Count; i++) {
|
||||
link.Append(segment.Parameters[i].Name);
|
||||
link.Append(parameterValues[pvC++]);
|
||||
if (i + 1 < segment.Parameters.Count && segment.Separator is not null)
|
||||
link.Append(segment.Separator);
|
||||
}
|
||||
}
|
||||
|
||||
return new SourceLink(link.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user