use super::types::DownloadId;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecursiveOptions {
pub max_depth: usize,
pub same_host_only: bool,
pub allowed_prefix: Option<String>,
#[serde(default)]
pub include_patterns: Vec<String>,
#[serde(default)]
pub exclude_patterns: Vec<String>,
pub preserve_paths: bool,
pub overwrite_existing: bool,
pub fail_fast: bool,
pub max_discovery_concurrency: usize,
}
impl Default for RecursiveOptions {
fn default() -> Self {
Self {
max_depth: 16,
same_host_only: true,
allowed_prefix: None,
include_patterns: Vec::new(),
exclude_patterns: Vec::new(),
preserve_paths: true,
overwrite_existing: false,
fail_fast: false,
max_discovery_concurrency: 4,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecursiveEntry {
pub url: String,
pub relative_path: PathBuf,
pub size_hint: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecursiveManifest {
pub root_url: String,
#[serde(default)]
pub entries: Vec<RecursiveEntry>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecursiveJob {
pub root_url: String,
#[serde(default)]
pub child_ids: Vec<DownloadId>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TrackedRecursiveJob {
pub id: Uuid,
pub root_url: String,
#[serde(default)]
pub child_ids: Vec<DownloadId>,
pub created_at: DateTime<Utc>,
}
impl TrackedRecursiveJob {
pub fn as_job(&self) -> RecursiveJob {
RecursiveJob {
root_url: self.root_url.clone(),
child_ids: self.child_ids.clone(),
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum RecursiveJobState {
Empty,
Queued,
Running,
Paused,
Completed,
Failed,
Partial,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecursiveJobProgress {
pub total_children: usize,
pub queued_children: usize,
pub active_children: usize,
pub paused_children: usize,
pub completed_children: usize,
pub failed_children: usize,
pub missing_children: usize,
pub completed_size: u64,
pub total_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecursiveJobStatus {
pub root_url: String,
#[serde(default)]
pub child_ids: Vec<DownloadId>,
pub state: RecursiveJobState,
pub progress: RecursiveJobProgress,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum RecursiveJobEvent {
Added {
job: TrackedRecursiveJob,
status: RecursiveJobStatus,
},
Updated {
job: TrackedRecursiveJob,
status: RecursiveJobStatus,
},
Removed { id: Uuid },
}