# `Selecto.Subfilter.Parser`

Parse subfilter configurations into structured subfilter specs.

This module handles parsing relationship paths like "film.rating" or "film.category.name"
and filter specifications like "R", ["R", "PG-13"], or {:count, ">", 5} into structured
data that can be used by the SQL generation system.

## Examples

    iex> Selecto.Subfilter.Parser.parse("film.rating", "R")
    {:ok, %Selecto.Subfilter.Spec{...}}

    iex> Selecto.Subfilter.Parser.parse("film", {:count, ">", 5})
    {:ok, %Selecto.Subfilter.Spec{...}}

    iex> Selecto.Subfilter.Parser.parse("film.category.name", "Action")
    {:ok, %Selecto.Subfilter.Spec{...}}

# `parse`

```elixir
@spec parse(String.t(), any(), keyword()) ::
  {:ok, Selecto.Subfilter.Spec.t()} | {:error, Selecto.Subfilter.Error.t()}
```

Parse subfilter into standardized configuration.

## Parameters

- `relationship_path` - String path like "film.rating" or "film.category.name"
- `filter_spec` - Filter specification (value, tuple, list, etc.)
- `opts` - Options including :strategy, :negate, etc.

## Examples

    parse("film.rating", "R")
    #=> {:ok, %Spec{relationship_path: %RelationshipPath{...}, ...}}

    parse("film.rating", ["R", "PG-13"], strategy: :in)
    #=> {:ok, %Spec{strategy: :in, ...}}

    parse("film", {:count, ">", 5})
    #=> {:ok, %Spec{filter_spec: %FilterSpec{type: :aggregation, ...}}}

# `parse_compound`

```elixir
@spec parse_compound(:and | :or, [{String.t(), any()}], keyword()) ::
  {:ok, Selecto.Subfilter.CompoundSpec.t()}
  | {:error, Selecto.Subfilter.Error.t()}
```

Parse compound subfilter operations (AND/OR).

## Examples

    parse_compound(:and, [
      {"film.rating", "R"},
      {"film.release_year", {">", 2000}}
    ])

---

*Consult [api-reference.md](api-reference.md) for complete listing*
