# rust-pocket
[![Coverage Status](https://coveralls.io/repos/github/ozbe/rust-pocket/badge.svg?branch=master)](https://coveralls.io/github/ozbe/rust-pocket?branch=master)

[Pocket API](http://getpocket.com/developer/docs/overview) bindings
(http://getpocket.com)

API is very easy, actually. The most complex code is for authorization.
You will need a consumer key and an access token in order to use the
API.

A consumer_key can be obtained by creating an app at the
[My Applications](http://getpocket.com/developer/apps/) page. An access
token is obtained by walking through
[OAuth authentication workflow](http://getpocket.com/developer/docs/authentication).

The OAuth workflow is implemented with a pair of methods in this
implementation:

```rust
let auth = PocketAuthentication::new("YOUR-CONSUMER-KEY-HERE", "rustapi:finishauth");
let state = None;
let code = auth.request(state).await?;
println!("Follow auth URL to provide access and press enter when finished: {}", auth.authorize_url(&code));
let _ = std::io::stdin().read_line(&mut String::new());

let user = auth.authorize(&code, state).await?;
```

So you
1. Initiate auth with `PocketAuthentication::new()`
2. Generate OAuth access request URL with `auth.request()`,
3. Let the user follow the URL and confirm app access
4. Call `auth.authorize()` and either get an error, or the
   username and access token of user just authorized.

You can then convert that user into an `Pocket` instance if you choose.

```rust
let pocket = user.pocket();
```

I recommend storing the access token after you get it, so you don't have
to repeat this workflow again next time. The access token can be
obtained via `user.access_token` field. Store it somewhere and use it to
construct a `Pocket` instance:

```rust
let pocket = Pocket::new("YOUR-CONSUMER-KEY-HERE", "YOUR-STORED-ACCESS-TOKEN");
```

A `Pocket` instance allows you to add, modify and retrieve items to and
from your pocket.

To add an item, use the `Pocket::add()` or
`Pocket::send()` method:

```rust
// Add with all meta-info provided (title, tags, tweet id)
let added_item = pocket.add(&PocketAddRequest::new(&url)
    .title("Example title")
    .tags(&["example-tag"])
    .tweet_id("example_tweet_id"))
    .await?;

// Add with one or more actions
let added_item = pocket.send(&PocketSendRequest { 
    actions: &[
        &PocketSendAction::Add {
            item_id: None,
            ref_id: None,
            tags: Some("example-tag".to_string()),
            time: None,
            title: Some("Example title".to_string()), 
            url: Url::parse("https://example.com").ok(), 
        }
    ]
}).await?;
```

To query your pocket, use `Pocket::filter()` and `Pocket::get()`
methods:

```rust
let mut f = pocket.filter();
f.complete(); // complete data
f.archived(); // archived items only
f.videos();   // videos only
f.offset(10); // items 10-20
f.count(10);
f.sort_by_title(); // sorted by title
// There are more methods, see `PocketGetRequest` struct for details

let items = pocket.get(&f).await; // get items
```

To modify one or multiple items or tags at a time, use `Pocket::send()`

```rust
let item_id = 1583845180185;
let results = pocket.send(&PocketSendRequest {
    actions: &[
        &PocketSendAction::Archive { item_id, time: None },
        &PocketSendAction::TagsAdd { item_id, tags: "one,two".to_string(), time: None },
        &PocketSendAction::TagRename { old_tag: "one".to_string(), new_tag: "1".to_string(), time: None },
    ]
}).await?;
```

## License

Licensed under either of

* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
  http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
  http://opensource.org/licenses/MIT)

at your option.

### Contribution

Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms
or conditions.
