#serialization #api-client #networking #api #client #io

无std lucia

一个灵活的客户端API框架以及一组API集合

5个版本 (破坏性)

0.5.0 2022年12月19日
0.4.0 2022年11月28日
0.3.0 2022年8月1日
0.2.0 2022年7月17日
0.1.0 2022年7月4日

#203#network

每月21次下载
用于 lucia-apis

MIT 许可证

180KB
5K SLoC

Lucia

CI crates.io Documentation License Rustc

一个灵活的客户端API框架,用于使用Rust编程语言编写异步、快速、可组织、可扩展且易于维护的应用程序。支持多种数据格式、传输和自定义参数。

查看lucia-apis项目,以查看基于lucia的API集合。

基础设施

实现Package特质的结构描述请求数据以及任何其他附加参数,如HTTP头值。

附加到API实例的辅助元素(如字节缓冲区或节流参数)在单独的强制实体PkgsAux中声明,该实体负责协助创建和管理包及其请求。

请查看以下使用lucia_macros创建JSON-RPC请求、使用reqwest发送数据以及使用serde_json解码从服务器返回的字节示例。

use lucia::{dnsn::SerdeJson, network::{transport::Transport, HttpParams}};

lucia::create_packages_aux_wrapper!();

#[derive(Debug)]
pub struct MyApi;

type MyApiPackagesAux = PkgsAux<MyApi, SerdeJson, HttpParams>;

#[lucia::pkg(api(super::MyApi), data_format(json_rpc("my_endpoint")), transport(http))]
mod my_endpoint {
  #[pkg::aux]
  impl super::MyApiPackagesAux {}

  #[derive(Debug, serde::Serialize)]
  #[pkg::req_data]
  pub struct MyEndpointReq<'any> {
    pub foo: i64,
    pub bar: &'any str,
  }

  #[derive(Debug, serde::Deserialize)]
  #[pkg::res_data]
  pub struct MyEndpointRes {
    pub data: i32,
  }
}

pub async fn fetch_my_endpoint() -> lucia::Result<i32> {
  let pkgs_aux = &mut MyApiPackagesAux::from_minimum(
    MyApi,
    SerdeJson,
    HttpParams::from_url("https://www.some_url.com/api/v1")?,
  );

  let pkg = &mut pkgs_aux.my_endpoint().data(123, "321").build();

  let trans = &mut reqwest::Client::new();

  Ok(trans.send_retrieve_and_decode_contained(pkg, pkgs_aux).await?.result?.data)
}

数据格式

每个请求都附加一个或多个特定于API的数据格式。

它们将被序列化和反序列化,因此为了创建另一种数据格式,需要根据所需的序列化器实现DeserializeSerialize

名称 URL
Borsh https://borsh.io/
GraphQL https://spec.graphql.org/
JSON https://www.json.org/json-en.html
JSON-RPC 2.0 https://www.jsonrpc.org/
Protobuf https://developers.google.com/protocol-buffers
XML https://www.w3.org/TR/xml/
YAML https://yaml.org/spec/

反序列化器/序列化器

可应用于一个或多个不同的数据格式。

功能 URL
borsh https://docs.rs/borsh
miniserde https://docs.rs/miniserde
rkyv https://docs.rs/rkyv
rust-protobuf https://docs.rs/protobuf
serde_json https://docs.rs/serde_json
serde-xml-rs https://docs.rs/serde-xml-rs
serde-yaml https://docs.rs/serde_yaml
simd-json https://docs.rs/simd-json

传输

请求应该如何部署。传输有自己的特例,方便地称为 Transport

可以在 lucia-macros 中声明自定义传输实现,使用 transport(custom(SomeTransport)) 属性。

名称 功能 URL
Reqwest reqwest https://docs.rs/reqwest
Surf surf https://docs.rs/surf
TcpStream std https://doc.rust-lang.net.cn/std/net/struct.TcpStream.html
tokio-tungstenite tokio-tungstenite https://docs.rs/tokio-tungstenite
UdpStream std https://doc.rust-lang.net.cn/std/net/struct.UdpSocket.html

依赖项

~0.4–21MB
~286K SLoC