Files
aria2-rust-pro/crates/aria2-rust-pro-cli/src/runtime_host.rs
T

114 lines
3.8 KiB
Rust

#![doc(hidden)]
#![expect(
clippy::redundant_pub_crate,
reason = "this private runtime host module is an internal orchestration façade for the CLI crate split"
)]
use std::path::PathBuf;
use aria2_rust_pro_compat::ConfigProfile;
use aria2_rust_pro_core::RuntimeConfig;
use aria2_rust_pro_protocol::Downloader;
use aria2_rust_pro_storage::ControlFileVersion;
use super::{
CliError, CliTransferSource, Invocation, RuntimeReport, StartupProfile, derive_http_session,
};
use crate::{
runtime_execution::{collect_runtime_execution_summary, execute_registered_transfers},
runtime_planning::{build_runtime_input_context, register_runtime_entries},
};
pub(super) fn execute_runtime_with_downloader_impl<D: Downloader + Sync>(
invocation: Invocation,
startup: &StartupProfile,
cli_profile: Option<&ConfigProfile>,
cli_transfer_sources: Option<&[CliTransferSource]>,
downloader: &D,
) -> Result<RuntimeReport, CliError> {
match invocation {
Invocation::Version | Invocation::Help { .. } => Ok(empty_runtime_report()),
Invocation::Run { config_path, uris } => execute_run_invocation(
config_path,
uris,
startup,
cli_profile,
cli_transfer_sources,
downloader,
),
}
}
fn empty_runtime_report() -> RuntimeReport {
RuntimeReport {
accepted_uri_count: 0,
tracked_download_count: 0,
completed_download_count: 0,
first_gid: None,
first_status: None,
first_total_length: None,
first_completed_length: None,
first_connections: None,
recognized_schemes: Vec::new(),
transfer_kinds: Vec::new(),
config_report: None,
derived_runtime: RuntimeConfig::default(),
http_session: derive_http_session(None, &StartupProfile::default()),
control_file_version_major: ControlFileVersion::CURRENT.major(),
first_bt_status: None,
}
}
fn execute_run_invocation<D: Downloader + Sync>(
config_path: Option<PathBuf>,
uris: Vec<String>,
startup: &StartupProfile,
cli_profile: Option<&ConfigProfile>,
cli_transfer_sources: Option<&[CliTransferSource]>,
downloader: &D,
) -> Result<RuntimeReport, CliError> {
let context = build_runtime_input_context(
config_path,
uris,
startup,
cli_profile,
cli_transfer_sources,
downloader,
)?;
let base_profile = context.effective_profile.as_ref();
let mut dispatcher =
super::InProcessRpcDispatcher::with_runtime(context.derived_runtime.clone());
let registered_entries = register_runtime_entries(
&mut dispatcher,
downloader,
context.resolved_entries,
base_profile,
)?;
execute_registered_transfers(
&mut dispatcher,
downloader,
&registered_entries,
base_profile,
&context.derived_runtime,
)?;
let summary = collect_runtime_execution_summary(&mut dispatcher, &registered_entries)?;
Ok(RuntimeReport {
accepted_uri_count: registered_entries.len(),
tracked_download_count: summary.tracked_download_count,
completed_download_count: summary.completed_download_count,
first_gid: summary.first_gid,
first_status: summary.first_status,
first_total_length: summary.first_total_length,
first_completed_length: summary.first_completed_length,
first_connections: summary.first_connections,
recognized_schemes: context.recognized_schemes,
transfer_kinds: context.transfer_kinds,
config_report: context.config_report,
derived_runtime: context.derived_runtime,
http_session: context.http_session,
control_file_version_major: ControlFileVersion::CURRENT.major(),
first_bt_status: summary.first_bt_status,
})
}