1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BasicServiceInfo {
pub name: String,
pub service_key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BasicHashList {
pub hashes: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct FileMetadataInfo {
pub file_id: u64,
pub hash: String,
pub size: Option<u64>,
pub mime: String,
pub ext: String,
pub width: Option<u32>,
pub height: Option<u32>,
pub duration: Option<u64>,
pub has_audio: Option<bool>,
pub num_frames: Option<u64>,
pub num_words: Option<u64>,
pub is_inbox: bool,
pub is_local: bool,
pub is_trashed: bool,
pub known_urls: Vec<String>,
pub service_names_to_statuses_to_tags: HashMap<String, HashMap<String, Vec<String>>>,
pub service_names_to_statuses_to_display_tags: HashMap<String, HashMap<String, Vec<String>>>,
}
#[derive(Clone, Debug)]
pub enum FileIdentifier {
ID(u64),
Hash(String),
}
impl FileIdentifier {
pub fn hash<S: ToString>(hash: S) -> Self {
Self::Hash(hash.to_string())
}
}
#[derive(Clone)]
pub struct FileRecord {
pub bytes: Vec<u8>,
pub mime_type: String,
}
#[derive(Clone, Debug, Deserialize)]
pub struct PageInformation {
pub name: String,
pub page_key: String,
pub page_type: u32,
#[serde(alias = "focused")]
pub selected: Option<bool>,
#[serde(default = "Vec::new")]
pub pages: Vec<PageInformation>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OptionalStringNumber {
String(String),
Number(u64),
None,
}
impl From<u64> for OptionalStringNumber {
fn from(value: u64) -> Self {
Self::Number(value)
}
}
impl From<String> for OptionalStringNumber {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl OptionalStringNumber {
pub fn string(&self) -> Option<&str> {
if let Self::String(s) = &self {
Some(s)
} else {
None
}
}
pub fn number(&self) -> Option<u64> {
if let Self::Number(n) = &self {
Some(*n)
} else {
None
}
}
}