runtime.rs (2376B)
1 use super::TeraRuntime; 2 use crate::composer::{id, version}; 3 use crate::{ 4 FfiComposerDraftRecord, FfiComposerPageRecord, FfiComposerSaveReceipt, FfiComposerSaveRequest, 5 FfiComposerScopeRecord, FfiRuntimeChangeKind, TeraAppError, 6 }; 7 use tera_core::runtime::product_surface::{ComposerPartialForm, ComposerScope}; 8 9 #[cfg_attr(not(coverage_nightly), uniffi::export(async_runtime = "tokio"))] 10 impl TeraRuntime { 11 /// Saves bounded editing data without validating publication or creating an operation. 12 pub async fn composer_save( 13 &self, 14 request: FfiComposerSaveRequest, 15 ) -> Result<FfiComposerSaveReceipt, TeraAppError> { 16 let (id, expected_revision, sequence) = request.validate_identity()?; 17 let scope: ComposerScope = request.scope.try_into()?; 18 let form: ComposerPartialForm = request.form.try_into()?; 19 let receipt = match expected_revision { 20 Some(revision) => { 21 self.inner 22 .composer_save(&scope, id, revision, sequence, form) 23 .await 24 } 25 None => self.inner.composer_create(&scope, id, sequence, form).await, 26 } 27 .map_err(TeraAppError::from)?; 28 self.subscriptions.notify( 29 FfiRuntimeChangeKind::Drafts, 30 Some(hex::encode(id.as_bytes())), 31 ); 32 Ok((&receipt).into()) 33 } 34 35 pub async fn composer_load( 36 &self, 37 scope: FfiComposerScopeRecord, 38 composer_id: String, 39 ) -> Result<FfiComposerDraftRecord, TeraAppError> { 40 let scope = scope.try_into()?; 41 let draft = self 42 .inner 43 .composer_load(&scope, id(&composer_id)?) 44 .await 45 .map_err(TeraAppError::from)?; 46 Ok((&draft).into()) 47 } 48 49 /// Live ID-ordered inventory. Resnapshot from None to discover insertions behind a cursor. 50 pub async fn composer_list( 51 &self, 52 schema_version: u16, 53 scope: FfiComposerScopeRecord, 54 limit: u16, 55 cursor: Option<String>, 56 ) -> Result<FfiComposerPageRecord, TeraAppError> { 57 version(schema_version)?; 58 let scope = scope.try_into()?; 59 let page = self 60 .inner 61 .composer_list(&scope, limit, cursor.as_deref()) 62 .await 63 .map_err(TeraAppError::from)?; 64 Ok((&page).into()) 65 } 66 }