Thanks for your interest in contributing! Here's everything you need to get started.
- Install Rust (1.85+)
- Clone the repo:
git clone https://github.com/aryanbhosale/pick.git cd pick - Run the tests:
cargo test
- Fork the repository
- Create a branch from
main:git checkout -b my-change
- Make your changes
- Ensure everything passes:
cargo test cargo clippy -- -D warnings cargo fmt --check - Push and open a pull request against
main
- Issues labeled
good first issueare a great starting point - Issues labeled
help wantedare open for contribution - Bug reports and feature requests are always welcome
All input formats are parsed into serde_json::Value as a unified data model. The selector engine then traverses this value tree.
stdin/file → detect format → parse → serde_json::Value → selector → output
Key files:
src/selector.rs— Selector parser and extraction logicsrc/detector.rs— Format auto-detection heuristicssrc/formats/— One file per format parsersrc/output.rs— Output formatting (plain, JSON, lines)tests/integration.rs— CLI integration tests
- Create
src/formats/my_format.rswith apub fn parse(input: &str) -> Result<Value, PickError>function - Add it to
src/formats/mod.rs - Add the variant to
InputFormatinsrc/cli.rs - Add detection logic in
src/detector.rs - Wire it up in
src/lib.rs - Add unit tests in the format file and integration tests in
tests/integration.rs
- Run
cargo fmtbefore committing - No clippy warnings (
cargo clippy -- -D warnings) - Write tests for new functionality
- Keep error messages concise and actionable
- PRs require review approval before merging
- CI must pass (tests, clippy, fmt)
- Keep PRs focused — one feature or fix per PR
- Update the README if adding user-facing features