1use std::cmp::Ordering;
2
3use chrono::{DateTime, Utc};
4
5#[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#[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}