transmission_client/
session.rs

1use std::path::PathBuf;
2
3use serde_with::{DefaultOnError, serde_as};
4use url::Url;
5
6use crate::rpc::RpcResponseArguments;
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
9#[serde(rename_all = "kebab-case")]
10pub enum Encryption {
11    Required,
12    Preferred,
13    Tolerated,
14}
15
16impl Default for Encryption {
17    fn default() -> Self {
18        Self::Preferred
19    }
20}
21
22#[serde_as]
23#[derive(Deserialize, Serialize, Debug)]
24#[serde(rename_all = "kebab-case")]
25pub struct Session {
26    pub alt_speed_down: i32,
27    pub alt_speed_enabled: bool,
28    pub alt_speed_time_begin: i32,
29    pub alt_speed_time_day: i32,
30    pub alt_speed_time_enabled: bool,
31    pub alt_speed_time_end: i32,
32    pub alt_speed_up: i32,
33    pub blocklist_enabled: bool,
34    pub blocklist_size: i32,
35    #[serde_as(deserialize_as = "DefaultOnError")]
36    #[serde(default)]
37    pub blocklist_url: Option<Url>,
38    pub cache_size_mb: i32,
39    pub config_dir: String,
40    pub dht_enabled: bool,
41    pub download_dir: PathBuf,
42    pub download_queue_enabled: bool,
43    pub download_queue_size: i32,
44    pub encryption: Encryption,
45    pub idle_seeding_limit: i32,
46    pub idle_seeding_limit_enabled: bool,
47    pub incomplete_dir: PathBuf,
48    pub incomplete_dir_enabled: bool,
49    pub lpd_enabled: bool,
50    pub peer_limit_global: i32,
51    pub peer_limit_per_torrent: i32,
52    pub peer_port: i32,
53    pub peer_port_random_on_start: bool,
54    pub pex_enabled: bool,
55    pub port_forwarding_enabled: bool,
56    pub queue_stalled_enabled: bool,
57    pub queue_stalled_minutes: i32,
58    pub rename_partial_files: bool,
59    pub rpc_version: i32,
60    pub rpc_version_minimum: i32,
61    #[serde(default)]
62    pub rpc_version_semver: String,
63    #[serde(default)]
64    pub script_torrent_added_enabled: bool,
65    #[serde(default)]
66    pub script_torrent_added_filename: String,
67    pub script_torrent_done_enabled: bool,
68    pub script_torrent_done_filename: String,
69    pub seed_queue_enabled: bool,
70    pub seed_queue_size: i32,
71    #[serde(rename = "seedRatioLimit")]
72    pub seed_ratio_limit: f32,
73    #[serde(rename = "seedRatioLimited")]
74    pub seed_ratio_limited: bool,
75    #[serde(default)]
76    pub session_id: String,
77    pub speed_limit_down: f32,
78    pub speed_limit_down_enabled: bool,
79    pub speed_limit_up: f32,
80    pub speed_limit_up_enabled: bool,
81    pub start_added_torrents: bool,
82    pub trash_original_torrent_files: bool,
83    // TODO: units
84    pub utp_enabled: bool,
85    pub version: String,
86}
87
88#[derive(Serialize, Debug, Clone, Default)]
89#[serde(rename_all = "kebab-case")]
90pub struct SessionMutator {
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub alt_speed_down: Option<i32>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub alt_speed_enabled: Option<bool>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub alt_speed_time_begin: Option<i32>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub alt_speed_time_day: Option<i32>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub alt_speed_time_enabled: Option<bool>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub alt_speed_time_end: Option<i32>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub alt_speed_up: Option<i32>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub blocklist_enabled: Option<bool>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub blocklist_url: Option<Url>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub cache_size_mb: Option<i32>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub dht_enabled: Option<bool>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub download_dir: Option<PathBuf>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub download_queue_enabled: Option<bool>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub download_queue_size: Option<i32>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub encryption: Option<Encryption>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub idle_seeding_limit: Option<i32>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub idle_seeding_limit_enabled: Option<bool>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub incomplete_dir: Option<PathBuf>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub incomplete_dir_enabled: Option<bool>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub lpd_enabled: Option<bool>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub peer_limit_global: Option<i32>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub peer_limit_per_torrent: Option<i32>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub peer_port: Option<i32>,
137    #[serde(skip_serializing_if = "Option::is_none")]
138    pub peer_port_random_on_start: Option<bool>,
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub pex_enabled: Option<bool>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub port_forwarding_enabled: Option<bool>,
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub queue_stalled_enabled: Option<bool>,
145    #[serde(skip_serializing_if = "Option::is_none")]
146    pub queue_stalled_minutes: Option<i32>,
147    #[serde(skip_serializing_if = "Option::is_none")]
148    pub rename_partial_files: Option<bool>,
149    #[serde(skip_serializing_if = "Option::is_none")]
150    pub script_torrent_added_enabled: Option<bool>,
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub script_torrent_added_filename: Option<String>,
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub script_torrent_done_enabled: Option<bool>,
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub script_torrent_done_filename: Option<String>,
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub seed_queue_enabled: Option<bool>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub seed_queue_size: Option<i32>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    #[serde(rename = "seedRatioLimit")]
163    pub seed_ratio_limit: Option<f32>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    #[serde(rename = "seedRatioLimited")]
166    pub seed_ratio_limited: Option<bool>,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub speed_limit_down: Option<f32>,
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub speed_limit_down_enabled: Option<bool>,
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub speed_limit_up: Option<f32>,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub speed_limit_up_enabled: Option<bool>,
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub start_added_torrents: Option<bool>,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub trash_original_torrent_files: Option<bool>,
179    #[serde(skip_serializing_if = "Option::is_none")]
180    pub utp_enabled: Option<bool>,
181}
182
183impl RpcResponseArguments for Session {}