# globlin
[![Package Version](https://img.shields.io/hexpm/v/globlin)](https://hex.pm/packages/globlin)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/globlin/)
This package brings file globbing to Gleam. A `Pattern` is created by compiling the glob pattern string into the equivalent regex internally. This pattern can then be compared against other strings to find matching paths.
Note: This library doesn't include methods to directly query the file system so that it can be used in the browser where that isn't available.
## Add Dependency
```sh
gleam add globlin
```
## Pattern Syntax
There are seven special matching patterns supported by this package. They should be familiar to anyone who has used similar packages before.
### Question Mark `?`
This matches any single character except the slash `/`.
### Star `*`
This matches zero or more characters except the slash `/`.
### Globstar `**`
This matches zero or more directories. It must be surrounded by the end of the string or slash `/`.
Examples:
- Isolated: `**`
- Prefix: `**/tail`
- Infix: `head/**/tail`
- Postfix: `**`
Note: When found at the end of the pattern, it matches all directories and files.
### Inclusive Char Set `[abc]`
This matches any character in the set.
### Exclusive Char Set `[!abc]`
This matches any character not in the set when the exclamation point `!` follows the opening square bracket.
### Inclusive Range `[a-z]`
This matches any character from start to finish.
### Exclusive Range `[!a-z]`
This matches any character not included in a range.
## Option Flags
There are two option flags available to change the behavior of matching. They are both turned off by default when using the `new_pattern` method.
### `ignore_case`
This changes all matches to be case insensitive.
### `match_dotfiles`
Allow wildcards like `?`, `*` and `**` to match dotfiles.
## Example
```gleam
import gleam/io
import gleam/list
import globlin
pub fn main() {
let files = [
".gitignore", "gleam.toml", "LICENCE", "manifest.toml", "README.md",
"src/globlin.gleam", "test/globlin_test.gleam",
]
let assert Ok(pattern) = globlin.new_pattern("**/*.gleam")
files
|> list.filter(keeping: globlin.match_pattern(pattern:, path: _))
|> list.each(io.println)
// src/globlin.gleam
// test/globlin_test.gleam
}
```
Further documentation can be found at <https://hexdocs.pm/globlin>.
## Development
```sh
gleam test # Run the tests
```