use std::time::Duration;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::serde_utils;
pub const CONFIG_NAME: &str = "mega-cli-rs";
pub const DEFAULT_API_ORIGIN: &str = "https://g.api.mega.co.nz/";
#[repr(u8)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "version")]
pub enum Config {
#[serde(rename = "1")]
V1(V1Config),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct V1Config {
pub auth: AuthConfig,
pub client: ClientConfig,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AuthConfig {
pub session: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ClientConfig {
pub origin: Url,
pub max_retries: usize,
#[serde(serialize_with = "serde_utils::duration::serialize")]
#[serde(deserialize_with = "serde_utils::duration::deserialize")]
pub min_retry_delay: Duration,
#[serde(serialize_with = "serde_utils::duration::serialize")]
#[serde(deserialize_with = "serde_utils::duration::deserialize")]
pub max_retry_delay: Duration,
#[serde(serialize_with = "serde_utils::duration::serialize_opt")]
#[serde(deserialize_with = "serde_utils::duration::deserialize_opt")]
pub timeout: Option<Duration>,
pub https: bool,
}
impl Default for Config {
fn default() -> Self {
Self::V1(V1Config::default())
}
}
impl Default for V1Config {
fn default() -> Self {
Self {
auth: AuthConfig::default(),
client: ClientConfig::default(),
}
}
}
impl Default for AuthConfig {
fn default() -> Self {
Self { session: None }
}
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
origin: Url::parse(DEFAULT_API_ORIGIN).unwrap(),
max_retries: 10,
min_retry_delay: Duration::from_millis(10),
max_retry_delay: Duration::from_secs(5),
timeout: Some(Duration::from_secs(10)),
https: false,
}
}
}