public void TypedMetaTest(IEnumerable <UriPathDescriptor> linkDescriptors, string url, UriMetadata expectedResult) { // Arrange var urlParser = new UriPathScanf(linkDescriptors); // Act var result = urlParser.ScanAll(url); var resultTyped = urlParser.Scan <UriPathScanfTestSource.TestTypedMetadata>(url); // Assert if (expectedResult != null) { result.UriType.Should().BeEquivalentTo(expectedResult.UriType); result.Type.Should().Be(expectedResult.Type); result.TryCast <UriPathScanfTestSource.TestTypedMetadata>(out var resultCasted); resultCasted.Should().BeEquivalentTo(expectedResult.Meta); resultTyped.Meta.Should().BeEquivalentTo(expectedResult.Meta); } else { result.Should().BeNull(); resultTyped.Should().BeNull(); } }
/// <summary> /// Example using scan and then casting or pattern matching /// </summary> public static void Go() { var descriptors = new[] { new UriPathDescriptor("/path/some/{varOne}", "varOneLink"), new UriPathDescriptor("/path/some/{someVar}/{someVar2}", "varTwoLink", typeof(Meta)), }; var uriPathScanf = new UriPathScanf(descriptors); // typed and not typed matches foreach (var u in new [] { "/path/some/12314?x=123", "/path/some/12314/xxx/?x=123" }) { var result = uriPathScanf.ScanAll(u); // pattern matching switch (result.Meta) { case IDictionary <string, string> m: Assert(result, m); break; case Meta m: Assert(result, m); break; } // casting if (result.TryCast <Meta>(out var resultMeta)) { Assert(result, resultMeta); } if (result.TryCastToDict(out var resultDict)) { Assert(result, resultDict); } } }