// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace Microsoft.AspNetCore.Routing.Template { [DebuggerDisplay("{DebuggerToString()}")] public class RouteTemplate { private const string SeparatorString = "/"; public RouteTemplate(string template, List segments) { if (segments == null) { throw new ArgumentNullException(nameof(segments)); } TemplateText = template; Segments = segments; Parameters = new List(); for (var i = 0; i < segments.Count; i++) { var segment = Segments[i]; for (var j = 0; j < segment.Parts.Count; j++) { var part = segment.Parts[j]; if (part.IsParameter) { Parameters.Add(part); } } } } public string TemplateText { get; } public IList Parameters { get; } public IList Segments { get; } public TemplateSegment GetSegment(int index) { if (index < 0) { throw new IndexOutOfRangeException(); } return index >= Segments.Count ? null : Segments[index]; } private string DebuggerToString() { return string.Join(SeparatorString, Segments.Select(s => s.DebuggerToString())); } /// /// Gets the parameter matching the given name. /// /// The name of the parameter to match. /// The matching parameter or null if no parameter matches the given name. public TemplatePart GetParameter(string name) { for (var i = 0; i < Parameters.Count; i++) { var parameter = Parameters[i]; if (string.Equals(parameter.Name, name, StringComparison.OrdinalIgnoreCase)) { return parameter; } } return null; } } }