#http-client #impl #client #http #web-client #web #api-bindings

happi

自动且类型安全的 API 客户端 - 提供接口,我将会愉快地完成剩余的工作 :)

5 个版本

0.0.6 2021 年 6 月 13 日
0.0.5 2021 年 6 月 12 日
0.0.4 2021 年 6 月 12 日
0.0.2 2021 年 6 月 11 日
0.0.1 2021 年 6 月 11 日

#14#web-client

MIT/Apache

13KB
130

crates.io docs.rs Maintenance

happi

一个自动实现 http 客户端的库,让你轻松使用 happi :)

这包括 CI/CD 管道、README 模板和 cargo-make 脚本。

示例

以下是一个使用 https://reqres.in/ 的示例,这是一个 happi 的实现,看起来会像这样

pub fn main() -> Result<(), dyn std::error::Error> {
  let reqres = ReqResApi(reqwest::blocking::Client::new());

  let user_page = reqres.get_all_users(None)?;

  println!("{:#?}", user_page);
}

// This is the *real* client that hits the API
#[happi(base_url = "https://reqres.in/api", blocking)]
pub struct ReqResApi(#[client] hyper::Client);

// This is a trait for the `user` resource that `happi`
// will implement for `ReqResApi`.
//
// When you want to use this resource, your function can
// accept an `impl reqres::UserResource`, accepting the real
// deal or a mock when you write tests.
#[happi(
  api(ReqResApi),
  resource("/users"),
  responds(200, json),
)]
pub trait UserResource {
  #[get]
  pub fn get_all_users(&self, #[query] page: Option<u32>) -> Result<UserPage, happi::Error>;

  #[get(
    "/{id}",
    responds(404, unit),
    when(status == 404, invoke = |_resp| Ok(None)),
  )]
  pub fn get_user(&self, id: u32) -> Result<Option<User>, happi::Error>;
}

#[derive(Debug, Serialize, Deserialize)]
pub struct User {
  id: u32,
  first_name: String,
  last_name: String,
  avatar: String,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct UserPage {
  page: u32,
  per_page: u32,
  total: u32,
  total_pages: u32,
  data: Vec<User>
}

许可证

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则根据 Apache-2.0 许可证定义的,你有意提交的任何贡献,都将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~7–16MB
~200K SLoC