b2-client 0.1.1

HTTP client-agnostic Backblaze B2 client library
Documentation
# B2-client - Backend-agnostic Backblaze B2 API Client

B2-client provides a Rust API to Backblaze B2 cloud storage service, backed by
any async HTTP client utilizing any async runtime.

Support for [Hyper](https://crates.io/crates/hyper),
[Isahc](https://crates.io/crates/isahc), and
[Surf](https://crates.io/crates/surf) are implemented out of the box.

The official repository for B2-client is on SourceHut at
[https://git.sr.ht/~rjframe/b2-client](https://git.sr.ht/~rjframe/b2-client),
with a mirror at Github on
[https://github.com/rjframe/b2-client](https://github.com/rjframe/b2-client).
Patches/pull requests from both are accepted; all other activity takes place at
SourceHut.

* Issues:
  [https://todo.sr.ht/~rjframe/b2-client]https://todo.sr.ht/~rjframe/b2-client
* Discussions:
  [https://lists.sr.ht/~rjframe/public]https://lists.sr.ht/~rjframe/public


## Table of Contents

* [Introduction]#introduction
    * [License]#license
* [Getting Started]#getting-started
    * [Install]#installation
    * [Testing]#testing
    * [Known Issues]#known-issues
* [Contributing]#contributing
* [Contact]#contact
* [Related Projects]#related-projects


## Introduction

B2-client is an async runtime-agnostic, HTTP client-agnostic interface to the
Backblaze B2 API. The full B2 API is supported.

Note that most of these functions can incur charges to your account.


## License

All library source code is licensed under the terms of the
[MPL 2.0 license](LICENSE.txt).

The source code of examples is licensed under the terms of the
[MIT license](examples/LICENSE.txt).


## Getting Started

### Installation

To use a pre-packaged HTTP client, choose the backend via the relevant feature.
Supported features are:

* `with_hyper`
* `with_surf`
* `with_isahc`

This list will eventually use the lower-level client libraries instead (e.g., h1
instead of hyper).

Add b2-client as a dependency via cargo; for example, to use the
[Surf](https://crates.io/crates/surf) HTTP client:

```shell
cargo add b2-client --features with_surf
```

There is no default client, so you must choose one of the above features or use
a custom HTTP client. To use your own HTTP backend, simply implement the
`HttpClient` trait then pass the struct to `account::authorize_account`.


### Testing

API calls are faked via pre-recorded sessions using the surf backend, so to run
all tests run `cargo test --features=with_surf`. No test runs against the live
B2 service by default.

To run a test against the live B2 API, set the environment variables
`B2_CLIENT_TEST_KEY` and `B2_CLIENT_TEST_KEY_ID` to a key/id pair capable of
performing the task you wish to test, and change the test's `VcrMode` to
`Record`. Although there will be no major-destructive tests (like deleting all
buckets), don't run a test against the live API unless you know what it's doing,
especially if you have production keys or buckets on your account.

A few tests will need minor modifications or setup to run against the B2 API
(e.g., deleting a bucket, changing the bucket ID), and a few tests will not pass
their pre-recorded sessions if the environment variables are set.


### Known Issues

* Error handling is bifurcated a bit; for example, uploading a file without the
  `WriteFiles` capability will return `Error::Unauthorized`, but uploading to a
  private bucket without the `ReadFiles` capabillity returns `Error::B2Error`.

  This is due to the fact that we can validate authorization to write prior to
  making the API call, but cannot pre-validate the authorization to read. This
  is solveable; it just requires determining the best method to merge them.


## Contributing

Patches and pull requests are welcome. For major features or breaking changes,
please open a ticket or start a discussion first so we can discuss what you
would like to do.

See [CONTRIBUTING.md](CONTRIBUTING.md) for pointers on getting set up. If you'd
like guidance on anything feel free to ask in a discussion or ticket, or submit
a draft PR.


## Contact

- Email: code@ryanjframe.com
- Website: [www.ryanjframe.com]https://www.ryanjframe.com
- diaspora*: rjframe@diasp.org


## Related Projects

* [b2_backblaze]https://crates.io/crates/b2_backblaze: Uses reqwest
* [raze]https://crates.io/crates/raze: Uses reqwest
* [backblaze-b2]https://crates.io/crates/backblaze-b2: Uses Hyper. Probably
  unmaintained