tower-api-client 0.1.1

Toolkit for creating API clients with Tower
Documentation
use serde::Serialize;
use serde_json::json;
use std::borrow::Cow;
use tower::ServiceExt;
use tower_api_client::{Client, EmptyResponse, Method, Request, RequestData};
use wiremock::matchers::{body_json, method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};

#[derive(Serialize)]
struct CreateUser {
    name: String,
}

impl Request for CreateUser {
    type Data = Self;
    type Response = EmptyResponse;
    const METHOD: Method = Method::POST;

    fn endpoint(&self) -> Cow<str> {
        "/user".into()
    }

    fn data(&self) -> RequestData<&Self> {
        RequestData::Json(self)
    }
}

#[tokio::test]
async fn post() {
    let _ = env_logger::try_init();
    let server = MockServer::start().await;
    let uri = server.uri();
    let client = Client::new(&uri);

    Mock::given(method("POST"))
        .and(path("/user"))
        .and(body_json(json!({"name": "User"})))
        .respond_with(ResponseTemplate::new(200))
        .mount(&server)
        .await;

    client
        .oneshot(CreateUser {
            name: "User".into(),
        })
        .await
        .unwrap();
}