private static RouteConstraintBuilder CreateBuilder(string template)
        {
            var options = new Mock <IOptions <RouteOptions> >(MockBehavior.Strict);

            options
            .SetupGet(o => o.Value)
            .Returns(new RouteOptions());

            var inlineConstraintResolver = new DefaultInlineConstraintResolver(options.Object);

            return(new RouteConstraintBuilder(inlineConstraintResolver, template));
        }
        public override IParameterPolicy Create(RoutePatternParameterPart parameter, string inlineText)
        {
            if (inlineText == null)
            {
                throw new ArgumentNullException(nameof(inlineText));
            }

            // Example:
            // {productId:regex(\d+)}
            //
            // ParameterName: productId
            // value: regex(\d+)
            // name: regex
            // argument: \d+
            (var name, var argument) = Parse(inlineText);

            if (!_options.ConstraintMap.TryGetValue(name, out var type))
            {
                throw new InvalidOperationException(Resources.FormatRoutePattern_ConstraintReferenceNotFound(
                                                        name,
                                                        typeof(RouteOptions),
                                                        nameof(RouteOptions.ConstraintMap)));
            }

            if (typeof(IRouteConstraint).IsAssignableFrom(type))
            {
                var constraint = DefaultInlineConstraintResolver.CreateConstraint(type, argument);
                return(InitializeRouteConstraint(parameter?.IsOptional ?? false, constraint, argument));
            }

            if (typeof(IParameterPolicy).IsAssignableFrom(type))
            {
                var parameterPolicy = (IParameterPolicy)_serviceProvider.GetRequiredService(type);
                return(parameterPolicy);
            }

            var message = Resources.FormatRoutePattern_InvalidStringConstraintReference(
                type,
                name,
                typeof(IRouteConstraint),
                typeof(IParameterPolicy));

            throw new InvalidOperationException(message);
        }
        private static RouteConstraintBuilder CreateBuilder(string template)
        {
            var options = new Mock<IOptions<RouteOptions>>(MockBehavior.Strict);
            options
                .SetupGet(o => o.Value)
                .Returns(new RouteOptions());

            var inlineConstraintResolver = new DefaultInlineConstraintResolver(options.Object);
            return new RouteConstraintBuilder(inlineConstraintResolver, template);
        }