4个版本

0.1.3 2020年10月4日
0.1.2 2020年10月3日
0.1.1 2020年10月3日
0.1.0 2020年10月3日

#634#sdk

MIT 许可证

10KB
94

asana-sdk

用于Asana Rest API的Rust Asana SDK

此crate使用model!宏来定义具有非常简洁语法的灵活模型结构体。
这些生成的结构体用于反序列化实体,从Asana API中选择包含的字段和嵌入关系。

有关完整文档,请参阅https://docs.rs/asana-sdk

model!(User "users" {
    email: String,
    name: String,
});

// Simple calls to get one or multiple users
let mut user:  User      = asana.get::<User>("me").await;
let mut users: Vec<User> = asana.list::<User>().await;
model!(TaskWithProjects "tasks" {
    name: String,
    projects: Vec<Project>
} Project);

let mut tasks_with_projects = asana
     .from::<Section>("12345678")
     .list::<TaskWithProjects>().await;

lib.rs:

用于Asana Rest API的Rust Asana SDK

此crate使用model!宏来定义具有非常简洁语法的灵活模型结构体。这些生成的结构体用于反序列化实体,从Asana API中选择包含的字段和嵌入关系。

Asana API返回具有不同字段和关系包含的灵活对象,因此此crate使用用户提供的模型。这使得crate也与Asana未来添加到API中的实体兼容。

为了使接口尽可能易于使用,它依赖于两个组件

  • model!()宏,用于轻松定义反序列化结构体(serde),以及端点URL和字段/关系包含查询字符串。
  • 使用Turbofish运算符(get::<Type>())调用定义的模型。

示例用法

use reqwest::{Error};
use asana_sdk::*;
use asana_sdk::models::Model;

#[tokio::main]
async fn main() -> Result<(), Error> {

    // Connect with your Asana PAT (token), from https://app.asana.com/0/developer-console
    let mut asana = Asana::connect(String::from("1/your:personal-access-token"));

    // A Model Struct linked to the "users" endpoint
    model!(User "users" {
        email: String,
        name: String,
    });

    // Simple calls to get one or multiple users
    let mut user:  User      = asana.get::<User>("me").await;
    let mut users: Vec<User> = asana.list::<User>().await;

    Ok(())
}

更多高级示例

复合调用以列出特定项目内的所有部分

model!(Section "sections" { name: String });
model!(Project "projects" { name: String });

let mut sections = asana
    .from::<Project>("12345678")
    .list::<Section>().await;

包含项目的任务结构体。TaskWithProjects仅是示例名称,您可以给结构体任何名称。

调用将列出特定部分的所有任务,并包含任务所属的所有其他项目。

model!(TaskWithProjects "tasks" {
    name: String,
    projects: Vec<Project>
} Project);

let mut tasks_with_projects = asana
     .from::<Section>("12345678")
     .list::<TaskWithProjects>().await;

请注意,所有模型结构体默认都包含gid和resource_type,因此不需要包含其他字段。

API中可能为null的字段应反序列化为Option

model!(Assignee "assignee" {});
model!(TaskWithAssignee "tasks" {
    name: String,
    assignee: Option<Assignee>
} Assignee);

依赖关系

~3–7.5MB
~171K SLoC