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
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