1个不稳定版本

0.16.0 2022年7月1日

#27#github-api

Download history 47/week @ 2024-04-01 17/week @ 2024-04-08 29/week @ 2024-04-15 25/week @ 2024-04-22 9/week @ 2024-04-29 15/week @ 2024-05-06 7/week @ 2024-05-13 22/week @ 2024-05-20 18/week @ 2024-05-27 34/week @ 2024-06-03 18/week @ 2024-06-10 8/week @ 2024-06-17 19/week @ 2024-06-24 17/week @ 2024-07-01 8/week @ 2024-07-08 14/week @ 2024-07-15

60 每月下载量
cargo-skyline 中使用

Apache-2.0/MIT

390KB
8K SLoC

Octocrab:一个现代、可扩展的GitHub API客户端。

Rust crates.io Help Wanted Lines Of Code Documentation

Octocrab是一个第三方GitHub API客户端,允许您使用Rust轻松构建自己的GitHub集成或机器人。Octocrab提供了两组主要的API来与GitHub通信,一个是用于扩展行为的低级别HTTP API,另一个是高层次的强类型语义API。

Cargo.toml

octocrab = "0.16"

语义API

语义API提供了围绕GitHub API的强类型支持,一组映射到GitHub类型的models模型,以及auth函数,后者对GitHub应用很有用。目前,以下模块可用。

获取Pull Request

// Get pull request #404 from `octocrab/repo`.
let issue = octocrab::instance().pulls("octocrab", "repo").get(404).await?;

所有带有多个可选参数的方法都构建为Builder结构体,让您可以轻松指定参数。

列出问题

let octocrab = octocrab::instance();
// Returns the first page of all issues.
let mut page = octocrab
    .issues("XAMPPRocky", "octocrab")
    .list()
    // Optional Parameters
    .creator("XAMPPRocky")
    .state(params::State::All)
    .per_page(50)
    .send()
    .await?;

// Go through every page of issues. Warning: There's no rate limiting so
// be careful.
loop {
    for issue in &page {
        println!("{}", issue.title);
    }
    page = match octocrab
        .get_page::<models::issues::Issue>(&page.next)
        .await?
    {
        Some(next_page) => next_page,
        None => break,
    }
}

HTTP API

当前类型API尚未涵盖GitHub的所有API,即使它覆盖了,GitHub也在积极开发中,并且这个库可能会在某些时候落后于GitHub。但这并不意味着为了使用这些功能,您必须使用自己的解决方案来分叉或替换octocrab

相反,octocrab公开了一套HTTP方法,允许您轻松扩展Octocrab的现有行为。使用这些HTTP方法,您可以使用相同的身份验证和配置,同时控制请求和响应。每种HTTP方法都有一个方法,例如getpostpatchputdelete,都接受一个相对路由和可选的正文。

let user: octocrab::models::User = octocrab::instance()
    .get("/user", None::<&()>)
    .await?;

每种HTTP方法都期望一个正文,使用基础URL格式化URL,如果GitHub没有返回成功状态,则出错。但是,当与GitHub的API一起工作时,这并不总是期望的,有时您需要检查响应状态或头信息。因此,存在配套方法_get_post等,它们不会对请求进行任何额外的预处理或后处理。

let octocrab = octocrab::instance();
let response =  octocrab
    ._get("https://api.github.com/organizations", None::<&()>)
    .await?;

// You can also use `Octocrab::absolute_url` if you want to still to go to
// the same base.
let response =  octocrab
    ._get(octocrab.absolute_url("/organizations")?, None::<&()>)
    .await?;

您可以使用这些HTTP方法轻松地为Octocrab的类型API创建自己的扩展。(需要async_trait)。

use octocrab::{Octocrab, Page, Result, models};

#[async_trait::async_trait]
trait OrganisationExt {
  async fn list_every_organisation(&self) -> Result<Page<models::Organization>>;
}

#[async_trait::async_trait]
impl OrganisationExt for Octocrab {
  async fn list_every_organisation(&self) -> Result<Page<models::Organization>> {
    self.get("/organizations", None::<&()>).await
  }
}

您还可以使用serde轻松访问当前模型中不可用的新属性。

#[derive(Deserialize)]
struct RepositoryWithVisibility {
    #[serde(flatten)]
    inner: octocrab::models::Repository,
    visibility: String,
}

let my_repo = octocrab::instance()
    .get::<RepositoryWithVisibility>("https://api.github.com/repos/XAMPPRocky/octocrab", None::<&()>)
    .await?;

静态API

Octocrab还提供了一个API的静态引用计数版本,允许您轻松地将它集成到现有系统中,而无需担心需要集成和传递客户端。

// Initialises the static instance with your configuration and returns an
// instance of the client.
octocrab::initialise(octocrab::Octocrab::builder());
// Gets a instance of `Octocrab` from the static API. If you call this
// without first calling `octocrab::initialise` a default client will be
// initialised and returned instead.
let octocrab = octocrab::instance();

依赖项

~15–28MB
~553K SLoC