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 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 {}