# Contributing to xfr

## Development Setup

1. Install Rust (1.88+):
   ```bash
   curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
   ```

2. Clone the repository:
   ```bash
   git clone https://github.com/lance0/xfr.git
   cd xfr
   ```

3. Build:
   ```bash
   cargo build
   ```

4. Run tests:
   ```bash
   cargo test --all-features
   ```

## Code Style

- Run `cargo fmt` before committing
- Run `cargo clippy --all-features` and fix any warnings
- Keep lines under 100 characters when possible

### Pre-commit hooks

We ship a `.pre-commit-config.yaml` that runs `cargo fmt` and `cargo clippy`
on every commit and `cargo test --lib` on every push. Set it up once:

```bash
# Recommended: prek (fast Rust port, drop-in compatible)
cargo install --locked prek
prek install

# Or via standalone installer (no Rust toolchain needed)
curl -LsSf https://github.com/j178/prek/releases/latest/download/prek-installer.sh | sh

# Or with the original Python pre-commit
pipx install pre-commit
pre-commit install --hook-type pre-commit --hook-type pre-push
```

After install, hooks run automatically. To run them manually against staged
files: `prek run` (or `pre-commit run`).

## Testing

```bash
# Run all tests
cargo test --all-features

# Run with specific feature
cargo test --features prometheus

# Run integration tests only
cargo test --test integration
```

## Pull Request Process

1. Fork the repository
2. Create a feature branch from `master`
3. Make your changes
4. Run `cargo fmt` and `cargo clippy --all-features`
5. Ensure all tests pass
6. Submit a pull request

## Feature Flags

| Flag | Description |
|------|-------------|
| `prometheus` | Enable Prometheus metrics endpoint |
| `discovery` | Enable mDNS LAN discovery (default) |

## Architecture Overview

```
src/
├── main.rs          # CLI entry point
├── lib.rs           # Library exports
├── client.rs        # Client implementation
├── serve.rs         # Server implementation
├── protocol.rs      # Control protocol messages
├── tcp.rs           # TCP data transfer
├── udp.rs           # UDP pacing and jitter
├── stats.rs         # Test statistics
├── config.rs        # Config file loading
├── diff.rs          # Result comparison
├── discover.rs      # mDNS discovery
├── tcp_info.rs      # Platform TCP_INFO
├── tui/             # Terminal UI
│   ├── app.rs       # App state
│   ├── ui.rs        # Drawing
│   └── widgets.rs   # Custom widgets
└── output/          # Output formats
    ├── plain.rs     # Plain text
    ├── json.rs      # JSON
    └── prometheus.rs # Prometheus metrics
```

## Adding Features

1. **New output format**: Add to `src/output/` and update `src/output/mod.rs`
2. **New protocol message**: Add to `ControlMessage` enum in `src/protocol.rs`
3. **New CLI flag**: Add to `Cli` struct in `src/main.rs`
4. **New config option**: Add to `src/config.rs` and update `examples/config.toml`

## Questions?

Open an issue on GitHub: https://github.com/lance0/xfr/issues
