mirror of
https://github.com/trailbaseio/trailbase.git
synced 2026-05-04 15:40:01 -05:00
Improve docs: add record API examples for Rust.
This commit is contained in:
Generated
+13
-2
@@ -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",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
resolver = "2"
|
||||
members = [
|
||||
"client/trailbase-rs",
|
||||
"docs/examples/record_api_rs",
|
||||
"examples/custom-binary",
|
||||
"trailbase-cli",
|
||||
"trailbase-core",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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/" }
|
||||
@@ -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?)
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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?)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user