feignhttp 0.5.2

Declarative HTTP client for rust
Documentation
use feignhttp::{feign, Feign};

use mockito::{mock, Matcher};

const URL: &str = "https://api.github.com";

#[derive(Feign)]
pub struct Feign;

#[feign(url = URL)]
impl Feign {
    #[get("/users/{user}")]
    async fn user(&self, #[path] user: &str) -> feignhttp::Result<String> {}
}

#[tokio::test]
async fn test_feign() {
    let r = Feign.user("dxx").await.unwrap();
    println!("{}", r);
}

#[derive(Feign)]
struct FeignClient {
    #[param]
    accept: &'static str,
    #[header("content-type")]
    c_type: &'static str,
    #[query(name = "say")]
    say: &'static str,
}
#[feign(url = "http://localhost:1234", headers = "accept: {accept}")]
impl FeignClient {
    #[get]
    async fn home(&self) -> feignhttp::Result<String> {}

    #[get("/repos", headers = "accept: application/json")]
    async fn repository(&self) -> feignhttp::Result<String> {}
}

#[tokio::test]
async fn test_feign_client() {
    let _mock_home = mock("GET", "/")
        .match_header("accept", "application/octet-stream")
        .match_header("content-type", "none")
        .match_query(Matcher::Regex("say=hello".into()))
        .create();

    let _mock_repo = mock("GET", "/repos")
        .match_header("accept", "application/json")
        .match_header("content-type", "none")
        .match_query(Matcher::Regex("say=hello".into()))
        .create();

    let client = FeignClient {
        accept: "application/octet-stream",
        c_type: "none",
        say: "hello",
    };

    client.home().await.unwrap();
    client.repository().await.unwrap();
}