Introduced some unit testing. Cleaned up some classes in Beam. Overhauled source link generation.

This commit is contained in:
2025-05-10 17:20:33 +03:00
parent bfdcdb1f3b
commit a086cfa02b
23 changed files with 386 additions and 185 deletions
+122
View File
@@ -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());
}
}
}