mockforge_collab/
client.rs1use crate::error::{CollabError, Result};
4use crate::sync::SyncMessage;
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7use tokio::sync::RwLock;
8use uuid::Uuid;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct ClientConfig {
13 pub server_url: String,
15 pub auth_token: String,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub enum ConnectionState {
22 Disconnected,
24 Connecting,
26 Connected,
28 Reconnecting,
30}
31
32pub struct CollabClient {
34 config: ClientConfig,
36 client_id: Uuid,
38 state: Arc<RwLock<ConnectionState>>,
40}
41
42impl CollabClient {
43 pub async fn connect(config: ClientConfig) -> Result<Self> {
45 let client = Self {
46 config,
47 client_id: Uuid::new_v4(),
48 state: Arc::new(RwLock::new(ConnectionState::Connecting)),
49 };
50
51 *client.state.write().await = ConnectionState::Connected;
54
55 Ok(client)
56 }
57
58 pub async fn subscribe_to_workspace(&self, workspace_id: &str) -> Result<()> {
60 let workspace_id = Uuid::parse_str(workspace_id)
61 .map_err(|e| CollabError::InvalidInput(format!("Invalid workspace ID: {}", e)))?;
62
63 let _message = SyncMessage::Subscribe { workspace_id };
64
65 Ok(())
68 }
69
70 pub async fn state(&self) -> ConnectionState {
72 *self.state.read().await
73 }
74
75 pub async fn disconnect(&self) -> Result<()> {
77 *self.state.write().await = ConnectionState::Disconnected;
78 Ok(())
79 }
80}