dream/router/parser
Pattern Parser - Convert string paths to structured segments
Parses route pattern strings (like “/users/:id/posts/**path”) into structured segment lists that the radix trie can use for matching.
Pattern Syntax
- Literal:
users- Matches exactly “users” - Parameter:
:id- Captures one segment as “id” - Single wildcard:
*or*name- Matches one segment - Multi wildcard:
**or**path- Matches zero or more segments - Extension:
*.jpg- Matches filenames ending in .jpg - Multiple extensions:
*.{jpg,png,gif}- Matches any of the listed extensions
Examples
parse_pattern("/users/:id")
// [Literal("users"), Param("id")]
parse_pattern("/files/**path")
// [Literal("files"), MultiWildcard(Some("path"))]
parse_pattern("/images/*.{jpg,png}")
// [Literal("images"), ExtensionPattern(["jpg", "png"])]
Pattern Precedence
When multiple routes could match the same path, the most specific wins:
- Literal segments (highest priority)
- Parameters
- Single wildcards
- Extension patterns
- Multi-segment wildcards (lowest priority)
Values
pub fn parse_pattern(pattern: String) -> List(trie.Segment)
Parse a path pattern string into a list of segments
Converts a string path pattern into structured segments that can be inserted into the radix trie. Handles all pattern types including literals, parameters, wildcards, and extension patterns.
Parameters
pattern: Path pattern string (e.g., “/users/:id”)
Returns
List of segments representing the pattern structure
Examples
// Simple literal path
parse_pattern("/users")
// [Literal("users")]
// Parameter capture
parse_pattern("/users/:id")
// [Literal("users"), Param("id")]
// Multi-segment wildcard
parse_pattern("/public/**filepath")
// [Literal("public"), MultiWildcard(Some("filepath"))]
// Extension matching
parse_pattern("/images/*.{jpg,png}")
// [Literal("images"), ExtensionPattern(["jpg", "png"])]
Pattern Details
- Leading and trailing slashes are ignored
- Empty segments (from multiple slashes) are filtered out
- Parameter names start with
:(e.g.,:id) - Wildcards start with
*for single-segment or**for multi-segment - Extensions use
*.extor*.{ext1,ext2,ext3}syntax