3个版本
0.1.2 | 2022年2月2日 |
---|---|
0.1.1 | 2021年9月3日 |
0.1.0 | 2021年9月3日 |
#1481 in 解析器实现
用于 2 crates
72KB
2K SLoC
firestore-serde
firestore-serde
是Firestore Value
和 Document
的序列化/反序列化实现。
这允许你在Firestore数据库中存储任意的Rust值,但这个crate不处理与Firestore服务的任何通信。相反,它旨在与其他crate一起使用
tonic
用于通过gRPC
连接到Firebase。googapis
用于Firebase gRPC消息定义,由 官方API定义 通过prost
派生。google-authz
用于身份验证/凭证发现。
预备知识
Firestore是Google的一个基于云的、专有文档数据库(不要与Firebase或Cloud Datastore混淆,它们也是Google的专有文档数据库)。
Google没有提供官方的Rust绑定用于Google Cloud Platform,但他们提供了REST和gRPC API的API规范。因此,出现了许多Rust项目,从这些规范中生成Rust绑定
Byron/google-apis-rs
生成REST API的绑定,在hyper
HTTP库之上实现。mechiru/googapis
生成gRPC API的绑定,在tonic
gRPC库之上实现。
REST API调用与gRPC API调用之间存在1:1映射。不幸的是,Firestore的REST API规范中存在一个已知问题,该问题破坏了查询功能,因此我建议不要使用REST API。因此,这个crate只支持gRPC API。如果您确实想使用REST API,请使用firestore-db-and-auth-rs
crate,而不是这个crate。
Firestore中数据检索的基本单位是Document
,它是一个从字符串字段到Value
的映射。Value
本身是一种丰富的类型,可以表示由其他值组成的数组和映射。因此,我们可以以直观的方式将许多Rust类型表示为Value
和Document
。这个crate提供了一个serde
序列化和反序列化器来执行这项操作。
用法
这个crate提供了四个主要功能
// Conversions between Rust types and Value gRPC type.
pub fn to_grpc_value<T>(value: &T)
-> Result<Value, SerializationError>
where T: Serialize;
pub fn from_grpc_value<T>(value: &Value)
-> Result<T, DeserializationError>
where T: DeserializeOwned;
// Conversions between Rust types and Document gRPC type.
pub fn to_document<T>(value: &T)
-> Result<Document, SerializationError>
where T: Serialize;
pub fn from_document<T>(document: Document)
-> Result<T, DeserializationError>
where T: DeserializeOwned;
请注意,from_document
会获取其参数的所有权,因此如果您需要在转换后保留原始的Document
,您将不得不克隆它。
时间戳
chrono crate支持可序列化的时间戳,通过将时间戳转换为字符串或数字来实现。默认情况下,firestore-serde
不会区分这些与其他数字或字符串,因此它们被转换为ValueType::IntegerValue
和ValueType::StringValue
。
如果您总是将值反序列化为Rust,这很好,但如果您想以其他方式访问数据(例如,基于Web的数据控制台),通常将时间数据存储在Firestore的ValueType::TimestampValue
中很有用。为此,将firestore-serde-timestamp
作为依赖项添加,并告诉Serde使用它作为编码
use serde::{Serialize, Deserialize};
use chrono::{DateTime, Utc};
#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(with="firestore_serde_timestamp::timestamp")]
some_timestamp: DateTime<Utc>,
}
API版本
目前有两个版本的gRPC API,即google.firestore.v1.*
和google.firestore.v1beta1.*
。每个版本都由不同的命名空间表示,该命名空间与其他版本隔离,因此即使类型在两个版本中都普遍使用(例如,Document
和Value
)也由不同的协议缓冲区表示。
firestore-serde
默认使用v1
命名空间,但可以通过功能标志来更改它。在您的Cargo.toml
中,指定依赖项如下
[dependencies]
firestore-serde = {version = "0.1.0", default-features=false, features=["google-firestore-v1beta1"]}
您必须禁用default-features
,因为如果同时启用了google-firestore-v1
和google-firestore-v1beta1
,则firestore-serde
将拒绝编译。
依赖项
~40MB
~565K SLoC