mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2025-12-11 20:15:30 +01:00
2.0 KiB
2.0 KiB
Rust <> TypeScript dataflow
- All resource types are defined in Rust and codegen'd by prisma-client-rust
- Queries/Mutations are defined in Rust and linked to a
Resource - Mutating resources will automatically trigger invalidation of cached data in TypeScript queries using that resource
Flow for changing an active "Job" resource for example:
- Resource is defined in a prisma schema
model Job { id Int @id @default(autoincrement()) client_id Int action Int status Int @default(0) percentage_complete Int @default(0) task_count Int @default(1) completed_task_count Int @default(0) date_created DateTime @default(now()) date_modified DateTime @default(now()) } - Resolver is defined in Rust
#[derive(Serialize, Deserialize)] pub struct GetLatestJobs { amount: u8 } impl Resolver for GetLatestJobs { pub async fn resolve(&self) -> Result<Vec<Job>> { let db = db::get().await?; let jobs = db.job().find_many(vec![]).exec().await?; Ok(jobs) } } - Register resolver
- this enum is serialized into TS for client
- queries have a single key derived from an enum using a macro
#[derive(Serialize, Deserialize, TS)] pub enum Requests { [expose_as("jobs::latest")] GetLatestJobs(GetLatestJobs) } - Rust backend dispatches change to a resource
Commit::new( Resource::Job, db.job() .find_unique(Job::id().equals(job_id.to_string())) .update(vec![ Job::percentage_complete().set(&percentage_complete), Job::completed_task_count().set(&completed_task_count), ]) ._raw_gql(), ) .exec() .await?; - Commit