Fluent API
The Fluent API is the only public API of this library. Everything starts from db.fluent():
use firestore::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
struct MyTestStructure {
some_id: String,
some_string: String,
one_more_string: String,
some_num: u64,
}
async fn example(db: FirestoreDb) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
use firestore::*;
const TEST_COLLECTION_NAME: FirestoreCollectionId = FirestoreCollectionId::from_static("test");
let my_struct = MyTestStructure {
some_id: "test-1".to_string(),
some_string: "Test".to_string(),
one_more_string: "Test2".to_string(),
some_num: 42,
};
// Create
let object_returned: MyTestStructure = db
.fluent()
.insert()
.into(TEST_COLLECTION_NAME)
.document_id(&my_struct.some_id)
.object(&my_struct)
.execute()
.await?;
// Update or Create
// (Firestore supports creating documents with update if you provide the document ID).
let object_updated: MyTestStructure = db
.fluent()
.update()
.fields(paths!(MyTestStructure::{some_num, one_more_string}))
.in_col(TEST_COLLECTION_NAME)
.document_id(&my_struct.some_id)
.object(&MyTestStructure {
some_num: my_struct.some_num + 1,
one_more_string: "updated-value".to_string(),
..my_struct.clone()
})
.execute()
.await?;
// Get object by id
let find_it_again: Option<MyTestStructure> = db
.fluent()
.select()
.by_id_in(TEST_COLLECTION_NAME)
.obj()
.one(&my_struct.some_id)
.await?;
// Delete data
db.fluent()
.delete()
.from(TEST_COLLECTION_NAME)
.document_id(&my_struct.some_id)
.execute()
.await?;
Ok(())
}
Create, update and delete documents covers the write calls above in detail.
The low level “support” traits are crate private. The migration guide lists the fluent replacement of every removed method.
On a database of the Enterprise edition, db.fluent() has two more entry points next to the Core
ones:
db.fluent().pipeline()for pipeline reads and writes;db.fluent().sql(..)for SQL statements, behind thesqlfeature.
Choosing Core queries, pipelines or SQL compares the three.
Alongside it, the library provides core functionality that is public API in its own right:
- Batch writes:
db.create_simple_batch_writer(),db.create_streaming_batch_writer() - Transactions:
db.begin_transaction(),db.run_transaction(), and theFirestoreTransactionOpstrait implemented by bothFirestoreTransactionandFirestoreTransactionData - Listeners:
db.create_listener(), and theFirestoreResumeStateStoragetrait for custom resume token storage - Caching: the
FirestoreCacheBackend/FirestoreCacheDocsByPathSupporttraits for custom cache backends - Dynamic documents:
FirestoreDb::serialize_map_to_doc(),FirestoreDb::serialize_to_doc()andFirestoreDb::deserialize_doc_to(), used together with the fluent.document(...)builders