defmodule Virtfs.PathGlob do @moduledoc """ Implements glob matching using the same semantics as `Path.wildcard/2`, but without any filesystem interaction. """ alias Vendor.PathGlob.Compiler @doc """ Returns whether or not `path` matches the `glob`. The glob is first parsed and compiled as a regular expression. If you're using the same glob multiple times in performance-critical code, consider using `compile/1` and caching the result. ## Examples iex> Virtfs.PathGlob.match?("{lib,test}/path_*.ex", "lib/path_glob.ex") true iex> Virtfs.PathGlob.match?("lib/*", "lib/.formatter.exs", match_dot: true) true """ def match?(path, glob, opts \\ []) @spec match?(String.t(), String.t(), match_dot: boolean()) :: boolean() def match?(glob, path, opts) when is_binary(glob) do String.match?(path, Compiler.compile(glob, opts)) end @spec match?(Regex.t(), String.t(), match_dot: boolean()) :: boolean() def match?(glob, path, _opts) when is_struct(glob, Regex) do String.match?(path, glob) end def compile(glob, opts \\ []), do: Compiler.compile(glob, opts) end