# Oxio
[![crates.io](https://img.shields.io/crates/v/oxio.svg)](https://crates.io/crates/oxio)
Oxio is a small snippet manager inspired by [Zach Holman](https://github.com/holman/)'s [boom](https://github.com/holman/boom). Quoting Zach's description of boom:
> You can stash away text like URLs, canned responses, and important notes and then quickly copy them onto your clipboard, ready for pasting.
## Installing
Install using [`cargo`](https://crates.io/):
```
cargo install oxio
```
## Usage
```
▲ oxio gif magic http://i.imgur.com/n5xR79B.gif
oxio: Ok, magic (in gif) is http://i.imgur.com/n5xR79B.gif
▲ oxio magic
oxio: http://i.imgur.com/n5xR79B.gif (from gif->magic) is now in your clipboard!
▲ oxio rm-item gif magic
oxio: Removed magic from gif
```
### Manipulating Items
To add items to your local cache, invoke `oxio` passing three arguments;
A `group`, the item `name` and the item's `value`. Those arguments are used
to write a new file in the local cache:
```
▲ oxio gif magic http://i.imgur.com/n5xR79B.gif
------^----^-----------------^----------------
| | |
| | Value
| Name
Group
```
To quickly copy an item to the clipboard, simply invoke `oxio` passing the
item name in the first argument:
```
▲ oxio magoc
oxio: http://i.imgur.com/n5xR79B.gif (from gif->magic) is now in your clipboard!
```
It then copies the item to your clipboard. Notice that the command above asked
for `magoc` instead of `magic`. Oxio attempts automatically fix typos.
In case you need an exact item, from an exact group, invoke `oxio` passing
the group, followed by the item's name:
```
▲ oxio gif magic
oxio: http://i.imgur.com/n5xR79B.gif (from gif->magic) is now in your clipboard!
```
To remove an item, use `rm-item`, again, passing the group's and item's name:
```
▲ oxio rm-item gif magic
oxio: Removed magic from gif
```
To remove a group and all its items, use `rm-group`:
```
▲ oxio rm-group gif magic
oxio: Removed group gif and all its items.
```
Then, to display all your items, use `oxio all`:
```
▲ oxio all
gif:
magic: http://i.imgur.com/n5xR79B.gif
```
Alternatively, to edit large items using your default editor, use `oxio edit`,
passing the group's and item's name:
```
▲ oxio edit gif magic
[opens your editor]
oxio: Ok, magic (in gif) is foobar
```
### Sync
For those using multiple machines, Oxio is able to sync a repository
with all local items.
To start using sync, create a new remote repository, and use one of the
following alternatives:
#### With an existing cache
In case you already have a local cache (you already added items),
use `oxio sync merge git-url`, where `git-url` is a git repository:
```
▲ oxio sync merge git@github.com:yourusername/.oxio.git
oxio: Clonning git@github.com:yourusername/.oxio.git into /var/folders/l1/n7yv6s4d5350p7nxyn8bmtsc0000gn/T/zcl7bKG1cY0mvMcpG5Y9AGjpnICvVa
oxio: Copying items to new temporary repository...
oxio: Performing sync...
oxio: Merging changes...
oxio: Pushing changes...
oxio: Sync complete
oxio: Applying local changes...
oxio: Done! 220 item(s) in the local repository. Use oxio sync to sync changes.
```
Oxio will automatically update the repository and your installation.
#### Without an existing cache
In case you haven't added items into your local cache, or you already have
a repository with Oxio items and want to download to your machine, use
`oxio sync init git-url`:
```
▲ oxio sync init git@github.com:yourusername/.oxio.git
oxio: Clonning git@github.com:yourusername/.oxio.git into /Users/yourusername/.oxio.cache
oxio: Done! 219 item(s) in the local repository. Use oxio sync to sync changes.
```
#### Syncing changes to your local cache
After adding, removing or editing items or groups, simply invoke `oxio sync`.
Remote changes will be downloaded to the local repository, and local changes
will be sent to it.
```
▲ oxio sync
oxio: Performing sync...
oxio: Merging changes...
oxio: Pushing changes...
oxio: Sync complete
```
## TODO
- [ ] Add Tests
## License
```
MIT License
Copyright (c) 2021 Victor Gama
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```