jarq 0.3.1

An interactive jq-like JSON query tool with a TUI
Documentation
# jarq

An interactive jq-like JSON query tool with a TUI.

Should you use this instead of `jq`? Definitely not, this was just an experiment using a TUI and live filtering.

## Usage

```bash
# Interactive TUI mode
echo '{"name": "Alice", "age": 30}' | jarq
cat data.json | jarq
jarq data.json

# Non-interactive mode (like jq)
echo '{"name": "Alice"}' | jarq '.name'
jarq '.items[]' data.json
```

In interactive mode, type filter expressions and see results in real-time.

## Keyboard Controls

### Navigation Mode

| Key | Action |
|-----|--------|
| `i`, `/` | Enter filter edit mode |
| `j`, `` | Scroll down |
| `k`, `` | Scroll up |
| `g` | Go to top |
| `G` | Go to bottom |
| `Ctrl-D` | Page down |
| `Ctrl-U` | Page up |
| `s` | Toggle slurp mode |
| `r` | Toggle raw output |
| `o` | Toggle compact output |
| `y` | Copy filter as jq command |
| `q`, `Esc` | Quit |
| `Ctrl-H` | Show help |

### Filter Edit Mode

| Key | Action |
|-----|--------|
| `Esc` | Exit filter edit mode |
| `Ctrl-P` | Toggle pause/resume evaluation |
| `Ctrl-C` | Cancel running evaluation |
| `Enter` | Evaluate now (when paused) |
| `Ctrl-S` | Toggle slurp mode |
| `Ctrl-R` | Toggle raw output |
| `Ctrl-O` | Toggle compact output |
| `Ctrl-Y` | Copy filter as jq command |
| `Ctrl-H` | Show help |

### Background Evaluation

jarq evaluates filters in the background as you type. For large files, you can:

- **Pause evaluation** (`Ctrl-P`): Stop auto-evaluation while you compose a complex filter
- **Cancel evaluation** (`Ctrl-C`): Stop a long-running evaluation and enter pause mode
- **Evaluate on demand** (`Enter`): When paused, manually trigger evaluation

When paused, the filter is still validated for syntax errors in real-time.

## Filter Syntax

```
.               # identity
.foo            # field access
.foo?           # optional (suppress errors)
.[0]            # array index
.[-1]           # negative index (from end)
.[2:5]          # array slice
.[:-1]          # slice (all but last)
.[]             # iterate all elements
.[]?            # optional iterate
.foo.bar        # chaining
.foo | length   # pipes

# Construction
[.a, .b]        # array
{name: .foo}    # object
{(.key): .val}  # dynamic key
```

## Builtins

`length`, `keys`, `values`, `type`, `first`, `last`, `reverse`, `sort`, `min`, `max`, `unique`, `flatten`, `add`, `empty`, `not`

## Building

```bash
cargo build --release
```

## License

MIT