Skip to main content

syncweb_core/folder/
sync_mode.rs

1use std::{fmt, str::FromStr};
2
3use crate::error::{Result, SyncwebError};
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
7#[non_exhaustive]
8pub enum SyncMode {
9    #[default]
10    SendReceive,
11    SendOnly,
12    ReceiveOnly,
13    ReceiveEncrypted,
14}
15
16impl SyncMode {
17    #[must_use]
18    pub const fn can_write_locally(self) -> bool {
19        matches!(self, Self::SendReceive | Self::SendOnly)
20    }
21
22    #[must_use]
23    pub const fn can_grant_write(self) -> bool {
24        matches!(self, Self::SendReceive)
25    }
26
27    #[must_use]
28    pub const fn can_receive(self) -> bool {
29        !matches!(self, Self::SendOnly)
30    }
31}
32
33impl fmt::Display for SyncMode {
34    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
35        formatter.write_str(match self {
36            Self::SendReceive => "sendreceive",
37            Self::SendOnly => "sendonly",
38            Self::ReceiveOnly => "receiveonly",
39            Self::ReceiveEncrypted => "receiveencrypted",
40        })
41    }
42}
43
44impl FromStr for SyncMode {
45    type Err = SyncwebError;
46
47    fn from_str(value: &str) -> Result<Self> {
48        match value.to_ascii_lowercase().replace(['-', '_'], "").as_str() {
49            "sendreceive" => Ok(Self::SendReceive),
50            "sendonly" => Ok(Self::SendOnly),
51            "receiveonly" => Ok(Self::ReceiveOnly),
52            "receiveencrypted" => Ok(Self::ReceiveEncrypted),
53            _ => Err(SyncwebError::InvalidSyncMode(value.to_owned())),
54        }
55    }
56}