using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using StardewModdingAPI.Toolkit; namespace StardewModdingAPI.Web.Framework { /// Constrains a route value to a valid semantic version. internal class VersionConstraint : IRouteConstraint { /********* ** Public methods *********/ /// Get whether the URL parameter contains a valid value for this constraint. /// An object that encapsulates information about the HTTP request. /// The router that this constraint belongs to. /// The name of the parameter that is being checked. /// A dictionary that contains the parameters for the URL. /// An object that indicates whether the constraint check is being performed when an incoming request is being handled or when a URL is being generated. /// true if the URL parameter contains a valid value; otherwise, false. public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (routeKey == null) throw new ArgumentNullException(nameof(routeKey)); if (values == null) throw new ArgumentNullException(nameof(values)); return values.TryGetValue(routeKey, out object? routeValue) && routeValue is string routeStr && SemanticVersion.TryParse(routeStr, allowNonStandard: true, out _); } } }