Improve docs: add record API examples for Rust.

This commit is contained in:
Sebastian Jeltsch
2025-01-21 17:05:00 +01:00
parent 7228fb88e5
commit 288d13f7f8
11 changed files with 163 additions and 3 deletions
Generated
+13 -2
View File
@@ -4424,6 +4424,17 @@ dependencies = [
"crossbeam-utils",
]
[[package]]
name = "record_api_rs"
version = "0.1.0"
dependencies = [
"anyhow",
"futures",
"serde_json",
"tokio",
"trailbase-client",
]
[[package]]
name = "redox_syscall"
version = "0.5.8"
@@ -5024,9 +5035,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.136"
version = "1.0.137"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2"
checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b"
dependencies = [
"indexmap 2.7.0",
"itoa",
+1
View File
@@ -2,6 +2,7 @@
resolver = "2"
members = [
"client/trailbase-rs",
"docs/examples/record_api_rs",
"examples/custom-binary",
"trailbase-cli",
"trailbase-core",
+2 -1
View File
@@ -6,7 +6,8 @@
#![allow(clippy::needless_return)]
use eventsource_stream::Eventsource;
use futures::{Stream, StreamExt};
pub use futures::Stream;
use futures::StreamExt;
use parking_lot::RwLock;
use reqwest::header::{HeaderMap, HeaderValue};
use reqwest::Method;
+12
View File
@@ -0,0 +1,12 @@
[package]
name = "record_api_rs"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
anyhow = "1.0.95"
futures = "0.3.31"
serde_json = "1.0.137"
tokio = { version = "^1.38.0", features = ["macros", "rt-multi-thread"] }
trailbase-client = { path = "../../../client/trailbase-rs/" }
+12
View File
@@ -0,0 +1,12 @@
use trailbase_client::Client;
pub async fn create(client: &Client) -> anyhow::Result<String> {
Ok(
client
.records("simple_strict_table")
.create(serde_json::json!({
"text_not_null": "test",
}))
.await?,
)
}
@@ -0,0 +1,5 @@
use trailbase_client::{Client, RecordId};
pub async fn delete(client: &Client, id: impl RecordId<'_>) -> anyhow::Result<()> {
Ok(client.records("simple_strict_table").delete(id).await?)
}
+61
View File
@@ -0,0 +1,61 @@
pub mod create;
pub mod delete;
pub mod read;
pub mod subscribe;
pub mod update;
#[cfg(test)]
mod test {
use futures::StreamExt;
use trailbase_client::Client;
use crate::create::*;
use crate::delete::*;
use crate::read::*;
use crate::subscribe::*;
use crate::update::*;
async fn connect() -> Client {
let client = Client::new("http://localhost:4000", None).unwrap();
client.login("admin@localhost", "secret").await.unwrap();
client
}
// CI should ignore this test, since it's not hermetic.
#[ignore]
#[tokio::test]
async fn example_test() {
let client = connect().await;
let table_stream = subscribe_all(&client).await.unwrap();
let id = create(&client).await.unwrap();
let record_stream = subscribe(&client, id.clone()).await.unwrap();
{
let record = read(&client, id.clone()).await.unwrap();
assert_eq!(
record.get("text_not_null").unwrap(),
&serde_json::Value::String("test".into())
);
}
{
update(&client, id.clone()).await.unwrap();
let record = read(&client, id.clone()).await.unwrap();
assert_eq!(
record.get("text_not_null").unwrap(),
&serde_json::Value::String("updated".into())
);
}
delete(&client, id).await.unwrap();
let record_events = record_stream.collect::<Vec<_>>().await;
assert_eq!(record_events.len(), 2);
let table_events = table_stream.take(3).collect::<Vec<_>>().await;
assert_eq!(table_events.len(), 3);
}
}
+5
View File
@@ -0,0 +1,5 @@
use trailbase_client::{Client, RecordId};
pub async fn read(client: &Client, id: impl RecordId<'_>) -> anyhow::Result<serde_json::Value> {
Ok(client.records("simple_strict_table").read(id).await?)
}
@@ -0,0 +1,12 @@
use trailbase_client::{Client, DbEvent, RecordId, Stream};
pub async fn subscribe(
client: &Client,
id: impl RecordId<'_>,
) -> anyhow::Result<impl Stream<Item = DbEvent>> {
Ok(client.records("simple_strict_table").subscribe(id).await?)
}
pub async fn subscribe_all(client: &Client) -> anyhow::Result<impl Stream<Item = DbEvent>> {
Ok(client.records("simple_strict_table").subscribe("*").await?)
}
+15
View File
@@ -0,0 +1,15 @@
use trailbase_client::{Client, RecordId};
pub async fn update(client: &Client, id: impl RecordId<'_>) -> anyhow::Result<()> {
Ok(
client
.records("simple_strict_table")
.update(
id,
serde_json::json!({
"text_not_null": "updated",
}),
)
.await?,
)
}
@@ -146,6 +146,7 @@ existing ones depending on conflict resolution strategy.
import createDartCode from "@examples/record_api_dart/lib/src/create.dart?raw";
import createTsCode from "@examples/record_api_ts/src/create.ts?raw";
import createDotnetCode from "@examples/record_api_dotnet/Create.cs?raw";
import createRustCode from "@examples/record_api_rs/src/create.rs?raw";
import createCurlCode from "@examples/record_api_curl/create.sh?raw";
<Tabs>
@@ -161,6 +162,10 @@ import createCurlCode from "@examples/record_api_curl/create.sh?raw";
<Code lang="cs" code={createDotnetCode} />
</TabItem>
<TabItem label="Rust">
<Code lang="rust" code={createRustCode} />
</TabItem>
<TabItem label="curl">
<Code lang="sh" frame="code" code={createCurlCode} />
</TabItem>
@@ -174,6 +179,7 @@ The read endpoint lets you read specific records given their id.
import readDartCode from "@examples/record_api_dart/lib/src/read.dart?raw";
import readTsCode from "@examples/record_api_ts/src/read.ts?raw";
import readDotnetCode from "@examples/record_api_dotnet/Read.cs?raw";
import readRustCode from "@examples/record_api_rs/src/read.rs?raw";
import readCurlCode from "@examples/record_api_curl/read.sh?raw";
<Tabs>
@@ -189,6 +195,10 @@ import readCurlCode from "@examples/record_api_curl/read.sh?raw";
<Code lang="cs" code={readDotnetCode} />
</TabItem>
<TabItem label="Rust">
<Code lang="rust" code={readRustCode} />
</TabItem>
<TabItem label="curl">
<Code lang="sh" frame="code" code={readCurlCode} />
</TabItem>
@@ -201,6 +211,7 @@ The update endpoint lets you modify, i.e. partially update, existing records giv
import updateDartCode from "@examples/record_api_dart/lib/src/update.dart?raw";
import updateTsCode from "@examples/record_api_ts/src/update.ts?raw";
import updateDotnetCode from "@examples/record_api_dotnet/Update.cs?raw";
import updateRustCode from "@examples/record_api_rs/src/update.rs?raw";
import updateCurlCode from "@examples/record_api_curl/update.sh?raw";
<Tabs>
@@ -216,6 +227,10 @@ import updateCurlCode from "@examples/record_api_curl/update.sh?raw";
<Code lang="cs" code={updateDotnetCode} />
</TabItem>
<TabItem label="Rust">
<Code lang="rust" code={updateRustCode} />
</TabItem>
<TabItem label="curl">
<Code lang="sh" frame="code" code={updateCurlCode} />
</TabItem>
@@ -226,6 +241,7 @@ import updateCurlCode from "@examples/record_api_curl/update.sh?raw";
import deleteDartCode from "@examples/record_api_dart/lib/src/delete.dart?raw";
import deleteTsCode from "@examples/record_api_ts/src/delete.ts?raw";
import deleteDotnetCode from "@examples/record_api_dotnet/Delete.cs?raw";
import deleteRustCode from "@examples/record_api_rs/src/delete.rs?raw";
import deleteCurlCode from "@examples/record_api_curl/delete.sh?raw";
<Tabs>
@@ -241,6 +257,10 @@ import deleteCurlCode from "@examples/record_api_curl/delete.sh?raw";
<Code lang="cs" code={deleteDotnetCode} />
</TabItem>
<TabItem label="Rust">
<Code lang="rust" code={deleteRustCode} />
</TabItem>
<TabItem label="curl">
<Code lang="sh" frame="code" code={deleteCurlCode} />
</TabItem>
@@ -291,6 +311,7 @@ updates, and deletions.
import subscribeDartCode from "@examples/record_api_dart/lib/src/subscribe.dart?raw";
import subscribeTsCode from "@examples/record_api_ts/src/subscribe.ts?raw";
import subscribeRustCode from "@examples/record_api_rs/src/subscribe.rs?raw";
import subscribeDotnetCode from "@examples/record_api_dotnet/Subscribe.cs?raw";
<Tabs>
@@ -305,6 +326,10 @@ import subscribeDotnetCode from "@examples/record_api_dotnet/Subscribe.cs?raw";
<TabItem label="C#/.NET">
<Code lang="cs" code={subscribeDotnetCode} />
</TabItem>
<TabItem label="Rust">
<Code lang="rust" code={subscribeRustCode} />
</TabItem>
</Tabs>
### Schema