syncweb_core/folder/
sync_mode.rs1use 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}