public T ParseSingleSegment <T>(string pattern) where T : Segment { if (pattern == "") { throw new ArgumentException("Pattern is empty.", nameof(pattern)); } var context = new ParseContext(pattern); var tokens = new GlobPathTokeniser().Tokenise(context).ToArray(); var segments = new GlobPathParser(Variables.ToArray()).Parse(context, tokens).ToArray(); if (segments.Length != 1) { throw new ArgumentException($"Pattern parsed as {segments.Length} segments.", nameof(pattern)); } return(segments.Single() as T ?? throw new ArgumentException($"Pattern parsed as a segment of type {segments.Single().GetType()} segments.", nameof(pattern))); }
public Glob Parse(string pattern) { if (pattern.TrimStart() != pattern) { throw new ArgumentException("Leading whitespace is not permitted.", nameof(pattern)); } var rootContext = new ParseContext(pattern); var root = TryParseRoot(rootContext, out var offset); var pathPattern = pattern.Substring(offset); if (pathPattern == "") { return(new Glob(root, new Segment[0])); } var context = new ParseContext(pathPattern); var tokens = new GlobPathTokeniser().Tokenise(context).ToArray(); var segments = new GlobPathParser(Variables.ToArray()).Parse(context, tokens).ToArray(); return(new Glob(root, segments)); }