Compare commits

..

2 Commits

Author SHA1 Message Date
GHXX 03ebfa1321 Merge branch 'feature/pathparams' 2024-08-11 06:45:06 +02:00
GHXX 8d0419b6ac fix inaccessible nodes behaving incorrectly 2024-08-11 06:44:33 +02:00

View File

@ -22,12 +22,12 @@ internal class PathTree<T> where T : class {
throw new Exception($"Found illegal catchall-wildcard in path: '{string.Join('/', path)}'"); throw new Exception($"Found illegal catchall-wildcard in path: '{string.Join('/', path)}'");
} }
var leafdata = unpackedLeafData[i]; var leafdata = unpackedLeafData[i] ?? throw new ArgumentNullException("Leafdata must not be null!");
rootNode.AddSuccessor(path, leafdata); rootNode.AddSuccessor(path, leafdata);
} }
} }
internal bool TryGetPath(string reqPath, [MaybeNullWhen(false)] out T? endpoint) { internal bool TryGetPath(string reqPath, [MaybeNullWhen(false)] out T endpoint) {
if (rootNode == null) { if (rootNode == null) {
endpoint = null; endpoint = null;
return false; return false;
@ -58,16 +58,16 @@ internal class PathTree<T> where T : class {
// return found path // return found path
endpoint = currNode.leafData; endpoint = currNode.leafData;
return true; return endpoint != null;
} }
private class Node { private class Node {
public T? leafData = null; public T? leafData = null; // null means that this is a node without a value (e.g. when it is just part of a path)
public Dictionary<string, Node>? next = null; public Dictionary<string, Node>? next = null;
public Node? pathWildcardNext = null; // path wildcard public Node? pathWildcardNext = null; // path wildcard
public Node? catchAllNext = null; // trailing-catchall wildcard public Node? catchAllNext = null; // trailing-catchall wildcard
public void AddSuccessor(string[] segments, T? newLeafData) { public void AddSuccessor(string[] segments, T newLeafData) {
if (segments.Length == 0) { // actually add the data to this node if (segments.Length == 0) { // actually add the data to this node
Assert(leafData == null); Assert(leafData == null);
leafData = newLeafData; leafData = newLeafData;