summaryrefslogtreecommitdiff
path: root/crates/vcs_actions/src/actions/sheet_actions.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2025-11-03 18:48:52 +0800
committer魏曹先生 <1992414357@qq.com>2025-11-03 18:48:52 +0800
commit5416c501e61e591cea85c1f30daa53818baa5f23 (patch)
tree4d7d156404da206b064231890a1e4862dd911f92 /crates/vcs_actions/src/actions/sheet_actions.rs
parentffb5805291343ba1cd4bb4f38788d9ce6e3e2ba6 (diff)
feat: Add sheet creation action
- Implement make_sheet_action for creating sheets - Add sheet-related constants - Update sheet data structures
Diffstat (limited to 'crates/vcs_actions/src/actions/sheet_actions.rs')
-rw-r--r--crates/vcs_actions/src/actions/sheet_actions.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/crates/vcs_actions/src/actions/sheet_actions.rs b/crates/vcs_actions/src/actions/sheet_actions.rs
index e69de29..b6ea51d 100644
--- a/crates/vcs_actions/src/actions/sheet_actions.rs
+++ b/crates/vcs_actions/src/actions/sheet_actions.rs
@@ -0,0 +1,79 @@
+use action_system::{action::ActionContext, macros::action_gen};
+use serde::{Deserialize, Serialize};
+use tcp_connection::error::TcpTargetError;
+use vcs_data::data::sheet::SheetName;
+
+use crate::actions::{auth_member, check_connection_instance, try_get_vault};
+
+#[derive(Default, Serialize, Deserialize)]
+pub enum MakeSheetActionResult {
+ Success,
+
+ // Fail
+ AuthorizeFailed(String),
+ SheetAlreadyExists,
+ SheetCreationFailed(String),
+
+ #[default]
+ Unknown,
+}
+
+/// Build a sheet with context
+#[action_gen]
+pub async fn make_sheet_action(
+ ctx: ActionContext,
+ sheet_name: SheetName,
+) -> Result<MakeSheetActionResult, TcpTargetError> {
+ let instance = check_connection_instance(&ctx)?;
+
+ // Auth Member
+ let member_id = match auth_member(&ctx, instance).await {
+ Ok(id) => id,
+ Err(e) => return Ok(MakeSheetActionResult::AuthorizeFailed(e.to_string())),
+ };
+
+ if ctx.is_proc_on_remote() {
+ let vault = try_get_vault(&ctx)?;
+
+ // Check if the sheet already exists
+ if vault.sheet(&sheet_name).await.is_ok() {
+ instance
+ .lock()
+ .await
+ .write(MakeSheetActionResult::SheetAlreadyExists)
+ .await?;
+ return Ok(MakeSheetActionResult::SheetAlreadyExists);
+ } else {
+ // Create the sheet
+ match vault.create_sheet(&sheet_name, &member_id).await {
+ Ok(_) => {
+ instance
+ .lock()
+ .await
+ .write(MakeSheetActionResult::Success)
+ .await?;
+ return Ok(MakeSheetActionResult::Success);
+ }
+ Err(e) => {
+ instance
+ .lock()
+ .await
+ .write(MakeSheetActionResult::SheetCreationFailed(e.to_string()))
+ .await?;
+ return Ok(MakeSheetActionResult::SheetCreationFailed(e.to_string()));
+ }
+ }
+ }
+ }
+
+ if ctx.is_proc_on_local() {
+ let result = instance
+ .lock()
+ .await
+ .read::<MakeSheetActionResult>()
+ .await?;
+ return Ok(result);
+ }
+
+ Err(TcpTargetError::NoResult("No result.".to_string()))
+}