pcloud/
entry.rs

1use std::cmp::Ordering;
2
3use chrono::{DateTime, Utc};
4
5/// A set of shared fields between [`File`](crate::file::File) and [`Folder`](crate::folder::Folder).
6#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
7pub struct EntryBase {
8    #[serde(with = "crate::date")]
9    pub created: DateTime<Utc>,
10    #[serde(with = "crate::date")]
11    pub modified: DateTime<Utc>,
12    #[serde(rename = "parentfolderid")]
13    pub parent_folder_id: Option<u64>,
14    pub icon: String,
15    pub id: String,
16    pub name: String,
17    pub path: Option<String>,
18    pub thumb: bool,
19    #[serde(rename = "isshared")]
20    pub is_shared: bool,
21    #[serde(rename = "ismine")]
22    pub is_mine: bool,
23}
24
25/// The representation of what can be returned by the PCloud API, a file or a folder.
26#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
27#[serde(untagged)]
28#[allow(clippy::large_enum_variant)]
29pub enum Entry {
30    File(crate::file::File),
31    Folder(crate::folder::Folder),
32}
33impl PartialOrd for Entry {
34    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
35        Some(self.cmp(other))
36    }
37}
38
39impl Ord for Entry {
40    fn cmp(&self, other: &Self) -> Ordering {
41        match (self, other) {
42            (Self::File(self_file), Self::File(other_file)) => self_file.cmp(other_file),
43            (Self::File(_), Self::Folder(_)) => Ordering::Greater,
44            (Self::Folder(self_folder), Self::Folder(other_folder)) => {
45                self_folder.cmp(other_folder)
46            }
47            (Self::Folder(_), Self::File(_)) => Ordering::Less,
48        }
49    }
50}
51
52impl From<crate::file::File> for Entry {
53    fn from(value: crate::file::File) -> Self {
54        Self::File(value)
55    }
56}
57
58impl From<crate::folder::Folder> for Entry {
59    fn from(value: crate::folder::Folder) -> Self {
60        Self::Folder(value)
61    }
62}
63
64impl Entry {
65    pub fn base(&self) -> &EntryBase {
66        match self {
67            Self::File(file) => &file.base,
68            Self::Folder(folder) => &folder.base,
69        }
70    }
71
72    pub fn file_id(&self) -> Option<u64> {
73        match self {
74            Self::File(item) => Some(item.file_id),
75            _ => None,
76        }
77    }
78
79    pub fn is_file(&self) -> bool {
80        matches!(self, Self::File(_))
81    }
82
83    pub fn into_file(self) -> Option<crate::file::File> {
84        match self {
85            Self::File(value) => Some(value),
86            _ => None,
87        }
88    }
89
90    pub fn as_file(&self) -> Option<&crate::file::File> {
91        match self {
92            Self::File(value) => Some(value),
93            _ => None,
94        }
95    }
96
97    pub fn folder_id(&self) -> Option<u64> {
98        match self {
99            Self::Folder(item) => Some(item.folder_id),
100            _ => None,
101        }
102    }
103
104    pub fn is_folder(&self) -> bool {
105        matches!(self, Self::Folder(_))
106    }
107
108    pub fn into_folder(self) -> Option<crate::folder::Folder> {
109        match self {
110            Self::Folder(value) => Some(value),
111            _ => None,
112        }
113    }
114
115    pub fn as_folder(&self) -> Option<&crate::folder::Folder> {
116        match self {
117            Self::Folder(value) => Some(value),
118            _ => None,
119        }
120    }
121}