3个版本

0.1.2 2022年2月2日
0.1.1 2021年9月3日
0.1.0 2021年9月3日

#1481 in 解析器实现


用于 2 crates

MIT/Apache

72KB
2K SLoC

firestore-serde

wokflow state crates.io

firestore-serde 是Firestore ValueDocument 的序列化/反序列化实现。

这允许你在Firestore数据库中存储任意的Rust值,但这个crate不处理与Firestore服务的任何通信。相反,它旨在与其他crate一起使用

预备知识

Firestore是Google的一个基于云的、专有文档数据库(不要与Firebase或Cloud Datastore混淆,它们也是Google的专有文档数据库)。

Google没有提供官方的Rust绑定用于Google Cloud Platform,但他们提供了REST和gRPC API的API规范。因此,出现了许多Rust项目,从这些规范中生成Rust绑定

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类型表示为ValueDocument。这个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::IntegerValueValueType::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.*。每个版本都由不同的命名空间表示,该命名空间与其他版本隔离,因此即使类型在两个版本中都普遍使用(例如,DocumentValue)也由不同的协议缓冲区表示。

firestore-serde默认使用v1命名空间,但可以通过功能标志来更改它。在您的Cargo.toml中,指定依赖项如下

[dependencies]
firestore-serde = {version = "0.1.0", default-features=false, features=["google-firestore-v1beta1"]}

您必须禁用default-features,因为如果同时启用了google-firestore-v1google-firestore-v1beta1,则firestore-serde将拒绝编译。

依赖项

~40MB
~565K SLoC