7 个不稳定版本 (3 个破坏性版本)
使用旧的 Rust 2015
0.4.1 | 2017年11月22日 |
---|---|
0.4.0 | 2017年11月22日 |
0.3.2 | 2017年11月20日 |
0.2.0 | 2017年11月5日 |
0.1.0 | 2017年10月29日 |
#1379 在 编码 类别中
每月25次下载
用于 json-api-rocket
180KB
3.5K SLoC
json-api
用于构建健壮的 JSON API 的惯用类型。
功能
序列化 DSL
您可以使用友好、声明性的 DSL 定义一个 Resource
。
简洁
#[macro_use]
extern crate json_api;
struct Post {
id: u64,
body: String,
title: String,
author: Option<User>,
comments: Vec<Comment>,
}
resource!(Post, |&self| {
// Define the id.
id self.id;
// Define the resource "type"
kind "posts";
// Define attributes with a comma seperated list of field names.
attrs body, title;
// Define relationships with a comma seperated list of field names.
has_one author;
has_many comments;
});
灵活
#[macro_use]
extern crate json_api;
struct Post {
id: u64,
body: String,
title: String,
author: Option<User>,
comments: Vec<Comment>,
}
resource!(Post, |&self| {
kind "articles";
id self.id;
attrs body, title;
// Define a virtual attribute with an expression
attr "preview", {
self.body
.chars()
.take(140)
.collect::<String>()
}
// Define a relationship with granular detail
has_one "author", {
// Data for has one should be Option<&T> where T: Resource
data self.author.as_ref();
// Define relationship links
link "self", format!("/articles/{}/relationships/author", self.id);
link "related", format!("/articles/{}/author", self.id);
// Define arbitrary meta members with a block expression
meta "read-only", true
}
// Define a relationship with granular detail
has_many "comments", {
// Data for has one should be an Iterator<Item = &T> where T: Resource
data self.comments.iter();
// Define relationship links
link "self", format!("/articles/{}/relationships/comments", self.id);
link "related", format!("/articles/{}/comments", self.id);
// Define arbitrary meta members with a block expression
meta "total", {
self.comments.len()
}
}
// You can also define links with granular details as well
link "self", {
href format!("/articles/{}", self.id);
}
// Define arbitrary meta members an expression
meta "copyright", self.author.as_ref().map(|user| {
format!("© 2017 {}", user.full_name())
});
});
Rocket 支持
json-api-rocket 包提供响应器以及用于捕获错误并返回 JSON API 错误文档的公平处理程序。
#![feature(plugin)]
#![plugin(rocket_codegen)]
#[macro_use]
extern crate json_api;
extern crate json_api_rocket;
extern crate rocket;
mod models;
use json_api_rocket::JsonApiFairing;
use json_api_rocket::response::{Collection, Member};
use models::Article;
#[get("/")]
fn collection() -> Collection<Article> {
(1..25).map(Article::new).collect()
}
#[get("/<id>")]
fn member(id: u64) -> Member<Article> {
Member(Article::new(id))
}
fn main() {
rocket::ignite()
.attach(JsonApiFairing)
.mount("/articles", routes![collection, member])
.launch();
}
许可协议
许可协议为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按照上述方式双重许可,不附加任何额外条款或条件。
依赖项
~5.5–7.5MB
~176K SLoC