use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, DisplayFromStr, TimestampSeconds};
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Version {
pub enabled_features: Vec<String>,
pub version: String,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Status {
pub gid: String,
pub status: TaskStatus,
#[serde_as(as = "DisplayFromStr")]
pub total_length: u64,
#[serde_as(as = "DisplayFromStr")]
pub completed_length: u64,
#[serde_as(as = "DisplayFromStr")]
pub upload_length: u64,
pub bitfield: Option<String>,
#[serde_as(as = "DisplayFromStr")]
pub download_speed: u64,
#[serde_as(as = "DisplayFromStr")]
pub upload_speed: u64,
pub info_hash: Option<String>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub num_seeders: Option<u64>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub seeder: Option<bool>,
#[serde_as(as = "DisplayFromStr")]
pub piece_length: u64,
#[serde_as(as = "DisplayFromStr")]
pub num_pieces: u64,
#[serde_as(as = "DisplayFromStr")]
pub connections: u64,
pub error_code: Option<String>,
pub error_message: Option<String>,
pub followed_by: Option<Vec<String>>,
pub following: Option<String>,
pub belongs_to: Option<String>,
pub dir: String,
pub files: Vec<File>,
pub bittorrent: Option<BittorrentStatus>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub verified_length: Option<u64>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub verify_integrity_pending: Option<bool>,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct BittorrentStatus {
pub announce_list: Vec<Vec<String>>,
pub comment: Option<String>,
#[serde_as(as = "Option<TimestampSeconds<i64>>")]
pub creation_date: Option<DateTime<Utc>>,
pub mode: Option<BitTorrentFileMode>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum BitTorrentFileMode {
Single,
Multi,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct File {
#[serde_as(as = "DisplayFromStr")]
pub index: u64,
pub path: String,
#[serde_as(as = "DisplayFromStr")]
pub length: u64,
#[serde_as(as = "DisplayFromStr")]
pub completed_length: u64,
#[serde_as(as = "DisplayFromStr")]
pub selected: bool,
pub uris: Vec<Uri>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Uri {
pub status: UriStatus,
pub uri: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum UriStatus {
Used,
Waiting,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum TaskStatus {
Active,
Waiting,
Paused,
Error,
Complete,
Removed,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Peer {
#[serde_as(as = "DisplayFromStr")]
pub am_choking: bool,
pub bitfield: String,
#[serde_as(as = "DisplayFromStr")]
pub download_speed: u64,
pub ip: String,
#[serde_as(as = "DisplayFromStr")]
pub peer_choking: bool,
pub peer_id: String,
#[serde_as(as = "DisplayFromStr")]
pub port: u16,
#[serde_as(as = "DisplayFromStr")]
pub seeder: bool,
#[serde_as(as = "DisplayFromStr")]
pub upload_speed: u64,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct GlobalStat {
#[serde_as(as = "DisplayFromStr")]
pub download_speed: u64,
#[serde_as(as = "DisplayFromStr")]
pub upload_speed: u64,
#[serde_as(as = "DisplayFromStr")]
pub num_active: i32,
#[serde_as(as = "DisplayFromStr")]
pub num_waiting: i32,
#[serde_as(as = "DisplayFromStr")]
pub num_stopped: i32,
#[serde_as(as = "DisplayFromStr")]
pub num_stopped_total: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct SessionInfo {
pub session_id: String,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct GetServersResult {
#[serde_as(as = "DisplayFromStr")]
pub index: i32,
pub servers: Vec<Server>,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Server {
pub uri: String,
pub current_uri: String,
#[serde_as(as = "DisplayFromStr")]
pub download_speed: u64,
}