open-library-api-rs 0.1.0

Async Rust client for the Open Library API
Documentation
// v0.0.1
use mockito::Server;
use open_library_api_rs::client::OpenLibraryClient;
use open_library_api_rs::models::common::VolumeIdType;
use open_library_api_rs::models::partner::VolumeStatus;

fn client_for(server: &Server) -> OpenLibraryClient {
    OpenLibraryClient::builder()
        .base_url(server.url())
        .rate_limit(100)
        .build()
        .unwrap()
}

#[tokio::test]
async fn read_volume_parses_response() {
    let mut server = Server::new_async().await;
    let mock = server
        .mock("GET", "/api/volumes/brief/isbn/0451450523.json")
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body(r#"{"records":{"http://openlibrary.org/books/OL7408846M":{"url":"https://openlibrary.org/books/OL7408846M","title":"The Lord of the Rings"}},"items":[{"status":"borrowable","url":"https://openlibrary.org/books/OL7408846M/read"}]}"#)
        .create_async()
        .await;

    let client = client_for(&server);
    let response = client
        .read_volume(VolumeIdType::Isbn, "0451450523")
        .await
        .unwrap();
    assert_eq!(response.records.len(), 1);
    assert_eq!(response.items[0].status, Some(VolumeStatus::Borrowable));
    mock.assert_async().await;
}

#[tokio::test]
async fn read_volume_empty_value_rejected() {
    let server = Server::new_async().await;
    let client = client_for(&server);
    let err = client.read_volume(VolumeIdType::Isbn, "").await.unwrap_err();
    assert!(matches!(err, open_library_api_rs::Error::InvalidInput(_)));
}