Crates.io | tapioca |
lib.rs | tapioca |
version | 0.0.1 |
source | src |
created_at | 2017-06-08 19:07:06.100656 |
updated_at | 2017-08-02 14:52:22.704919 |
description | Type-safe REST client using the OpenAPI Specification |
homepage | |
repository | https://github.com/OJFord/tapioca/tree/master/tapioca |
max_upload_size | |
id | 18243 |
size | 9,732 |
Typed APIs (that Ollie Coshed into an Acronym)
tapioca is an HTTP client for rust that aims to help the compiler help you to access REST+JSON APIs in a type-safer manner.
It uses the OpenAPI Initiative's schema specification to infer types for path and query parameters, request and response bodies, et al. and then serde to de/serialise them.
infer_api!(service, "https://service.api/schema.yml")
use service::path;
fn main() {
let auth = service::ServerAuth::new();
match path::get(&auth) {
Ok(response) => match response.body() {
path::OkBody::Status200(body) => println!("Thing is: {}", body.thing),
path::OkBody::UnspecifiedCode(body) => {
// We're forced to handle every status code in the schema;
// including the possibility that the server replies off-script.
println!("I don't know what thing is!")
},
},
Err(response) => match response.body() {
path::ErrBody::Status403(body) => println!("That's not my thing"),
path::ErrBody::UnspecifiedCode(_)
| path::ErrBody::MalformedJson(_)
| path::ErrBody::NetworkFailure() => println!("Something went wrong"),
},
}
}
So, we can pattern-match responses by status code, and access the JSON response
as a rust type. tapioca also aims to prevent you from shooting yourself in
the foot with an invalid sequence of requests, such as 'GET
after DELETE
'
on a particular resource: this is achieved by constructing resource IDs only
from responses, and static values. DELETE
functions cause the resource ID
argument to be moved (while other methods only borrow) preventing it from
being further used.