# Oxford Join [![docs.rs](https://img.shields.io/docsrs/oxford_join.svg?style=flat-square&label=docs.rs)](https://docs.rs/oxford_join/) [![changelog](https://img.shields.io/crates/v/oxford_join.svg?style=flat-square&label=changelog&color=9b59b6)](https://github.com/Blobfolio/oxford_join/blob/master/CHANGELOG.md)
[![crates.io](https://img.shields.io/crates/v/oxford_join.svg?style=flat-square&label=crates.io)](https://crates.io/crates/oxford_join) [![ci](https://img.shields.io/github/actions/workflow/status/Blobfolio/oxford_join/ci.yaml?style=flat-square&label=ci)](https://github.com/Blobfolio/oxford_join/actions) [![deps.rs](https://deps.rs/repo/github/blobfolio/oxford_join/status.svg?style=flat-square&label=deps.rs)](https://deps.rs/repo/github/blobfolio/oxford_join)
[![license](https://img.shields.io/badge/license-wtfpl-ff1493?style=flat-square)](https://en.wikipedia.org/wiki/WTFPL) [![contributions welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square&label=contributions)](https://github.com/Blobfolio/oxford_join/issues) Join a slice of strings with [Oxford Commas](https://en.wikipedia.org/wiki/Serial_comma) inserted as necessary, using the `Conjunction` of your choice. (You know, as it should be. Haha.) The return formatting depends on the size of the set: ``` 0: "" 1: "first" 2: "first last" n: "first, second, …, last" ``` This crate is `#![no_std]`-compatible. ## Examples The magic is accomplished with the `OxfordJoin` trait. Import that, and most slice-y things holding `AsRef` will inherit the `OxfordJoin::oxford_join` method for joining. ```rust use oxford_join::{Conjunction, OxfordJoin}; let set = ["Apples", "Oranges"]; assert_eq!(set.oxford_join(Conjunction::And), "Apples and Oranges"); let set = ["Apples", "Oranges", "Bananas"]; assert_eq!(set.oxford_join(Conjunction::And), "Apples, Oranges, and Bananas"); // There are also shorthand methods for and, or, and_or, and nor, allowing you // to skip the Conjunction enum entirely. assert_eq!(set.oxford_and(), "Apples, Oranges, and Bananas"); assert_eq!(set.oxford_and_or(), "Apples, Oranges, and/or Bananas"); assert_eq!(set.oxford_nor(), "Apples, Oranges, nor Bananas"); assert_eq!(set.oxford_or(), "Apples, Oranges, or Bananas"); ``` That's all, folks! ## Installation Add `oxford_join` to your `dependencies` in `Cargo.toml`, like: ```toml [dependencies] oxford_join = "0.4.*" ``` ## License Copyright © 2024 [Blobfolio, LLC](https://blobfolio.com) <hello@blobfolio.com> This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO.