/// <summary> /// Does the specified URI represent a template? /// </summary> /// <param name="uri"> /// The URI. /// </param> /// <returns> /// <c>true</c>, if any of the URI's components are parameterised (i.e. have non-constant values); otherwise, <c>false</c>. /// </returns> public static bool IsTemplate(string uri) { if (uri == null) { throw new ArgumentNullException(nameof(uri)); } IReadOnlyList <TemplateSegment> templateSegments = TemplateSegment.Parse(uri); return(templateSegments.Any(segment => segment.IsParameterized)); }
public void Can_Parse_TemplateSegments_From_Uri_WithQuery() { IReadOnlyList <TemplateSegment> segments = TemplateSegment.Parse( "api/{controller}/{action}/{id?}/properties?propertyIds={propertyGroupIds}&diddly={dee?}&foo=bar" ); Assert.Equal(9, segments.Count); Assert.IsAssignableFrom <RootUriSegment>(segments[0]); LiteralUriSegment apiSegment = Assert.IsAssignableFrom <LiteralUriSegment>(segments[1]); Assert.Equal("api", apiSegment.Value); ParameterizedUriSegment controllerSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[2]); Assert.True(controllerSegment.IsDirectory); Assert.Equal("controller", controllerSegment.TemplateParameterName); Assert.False(controllerSegment.IsOptional); ParameterizedUriSegment actionSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[3]); Assert.True(actionSegment.IsDirectory); Assert.Equal("action", actionSegment.TemplateParameterName); Assert.False(actionSegment.IsOptional); ParameterizedUriSegment idSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[4]); Assert.True(idSegment.IsDirectory); Assert.Equal("id", idSegment.TemplateParameterName); Assert.True(idSegment.IsOptional); LiteralUriSegment propertiesSegment = Assert.IsAssignableFrom <LiteralUriSegment>(segments[5]); Assert.False(propertiesSegment.IsDirectory); Assert.Equal("properties", propertiesSegment.Value); ParameterizedQuerySegment propertyIdsSegment = Assert.IsAssignableFrom <ParameterizedQuerySegment>(segments[6]); Assert.Equal("propertyIds", propertyIdsSegment.QueryParameterName); Assert.Equal("propertyGroupIds", propertyIdsSegment.TemplateParameterName); Assert.False(propertyIdsSegment.IsOptional); ParameterizedQuerySegment diddlySegment = Assert.IsAssignableFrom <ParameterizedQuerySegment>(segments[7]); Assert.Equal("diddly", diddlySegment.QueryParameterName); Assert.Equal("dee", diddlySegment.TemplateParameterName); Assert.True(diddlySegment.IsOptional); LiteralQuerySegment fooSegment = Assert.IsAssignableFrom <LiteralQuerySegment>(segments[8]); Assert.Equal("foo", fooSegment.QueryParameterName); Assert.Equal("bar", fooSegment.QueryParameterValue); }
/// <summary> /// Create a new URI template. /// </summary> /// <param name="template"> /// The template. /// </param> public UriTemplate(string template) { if (String.IsNullOrWhiteSpace(template)) { throw new ArgumentException("Argument cannot be null, empty, or composed entirely of whitespace: 'template'.", nameof(template)); } _template = template; IReadOnlyList <TemplateSegment> templateSegments = TemplateSegment.Parse(_template); _uriSegments = templateSegments.OfType <UriSegment>().ToArray(); if (_uriSegments.Count == 0) { throw new UriTemplateException("Invalid URI template (contains no path segments)."); } _querySegments = templateSegments.OfType <QuerySegment>().ToArray(); }
public void Can_Parse_TemplateSegments_From_Uri() { IReadOnlyList <TemplateSegment> segments = TemplateSegment.Parse( "api/{controller}/{action}/{id?}/properties" ); Assert.Equal(6, segments.Count); Assert.IsAssignableFrom <RootUriSegment>(segments[0]); LiteralUriSegment apiSegment = Assert.IsAssignableFrom <LiteralUriSegment>(segments[1]); Assert.Equal("api", apiSegment.Value); ParameterizedUriSegment controllerSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[2]); Assert.True(controllerSegment.IsDirectory); Assert.Equal("controller", controllerSegment.TemplateParameterName); Assert.False(controllerSegment.IsOptional); ParameterizedUriSegment actionSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[3]); Assert.True(actionSegment.IsDirectory); Assert.Equal("action", actionSegment.TemplateParameterName); Assert.False(actionSegment.IsOptional); ParameterizedUriSegment idSegment = Assert.IsAssignableFrom <ParameterizedUriSegment>(segments[4]); Assert.True(idSegment.IsDirectory); Assert.Equal("id", idSegment.TemplateParameterName); Assert.True(idSegment.IsOptional); LiteralUriSegment propertiesSegment = Assert.IsAssignableFrom <LiteralUriSegment>(segments[5]); Assert.False(propertiesSegment.IsDirectory); Assert.Equal("properties", propertiesSegment.Value); }