transmission_client/
utils.rs

1use serde::{Deserialize, Deserializer};
2
3pub fn torrent_fields() -> Vec<String> {
4    vec![
5        "id".into(),
6        "activityDate".into(),
7        "addedDate".into(),
8        "bandwidthPriority".into(),
9        "comment".into(),
10        "corruptEver".into(),
11        "creator".into(),
12        "dateCreated".into(),
13        "desiredAvailable".into(),
14        "doneDate".into(),
15        "downloadDir".into(),
16        "downloadedEver".into(),
17        "downloadLimit".into(),
18        "downloadLimited".into(),
19        "editDate".into(),
20        "error".into(),
21        "errorString".into(),
22        "eta".into(),
23        "etaIdle".into(),
24        "hashString".into(),
25        "haveUnchecked".into(),
26        "haveValid".into(),
27        "honorsSessionLimits".into(),
28        "isFinished".into(),
29        "isPrivate".into(),
30        "isStalled".into(),
31        "labels".into(),
32        "leftUntilDone".into(),
33        "magnetLink".into(),
34        "manualAnnounceTime".into(),
35        "metadataPercentComplete".into(),
36        "name".into(),
37        "percentDone".into(),
38        "pieces".into(),
39        "pieceCount".into(),
40        "pieceSize".into(),
41        "primary-mime-type".into(),
42        "queuePosition".into(),
43        "rateDownload".into(),
44        "rateUpload".into(),
45        "recheckProgress".into(),
46        "secondsDownloading".into(),
47        "secondsSeeding".into(),
48        "seedIdleLimit".into(),
49        "seedIdleMode".into(),
50        "seedRatioLimit".into(),
51        "seedRatioMode".into(),
52        "sizeWhenDone".into(),
53        "startDate".into(),
54        "status".into(),
55        "totalSize".into(),
56        "torrentFile".into(),
57        "uploadedEver".into(),
58        "uploadLimit".into(),
59        "uploadLimited".into(),
60        "uploadRatio".into(),
61    ]
62}
63
64pub fn torrent_files_fields() -> Vec<String> {
65    vec![
66        "id".into(),
67        "file-count".into(),
68        "files".into(),
69        "fileStats".into(),
70        "wanted".into(),
71        "priorities".into(),
72    ]
73}
74
75pub fn torrent_peers_fields() -> Vec<String> {
76    vec![
77        "id".into(),
78        "peer-limit".into(),
79        "peers".into(),
80        "peersConnected".into(),
81        "peersFrom".into(),
82        "peersGettingFromUs".into(),
83        "peersSendingToUs".into(),
84        "maxConnectedPeers".into(),
85        "webseeds".into(),
86        "webseedsSendingToUs".into(),
87    ]
88}
89
90pub fn torrent_trackers_fields() -> Vec<String> {
91    vec!["id".into(), "trackers".into(), "trackerStats".into()]
92}
93
94pub fn string_fallback<'de, D>(deserializer: D) -> Result<String, D::Error>
95where
96    D: Deserializer<'de>,
97{
98    #[derive(Deserialize)]
99    #[serde(untagged)]
100    enum StringOrNumber {
101        String(String),
102        Number(i64),
103    }
104
105    match StringOrNumber::deserialize(deserializer)? {
106        StringOrNumber::String(s) => Ok(s),
107        StringOrNumber::Number(i) => Ok(i.to_string()),
108    }
109}