1use std::error::Error;
2use std::io::Read;
3use crate::config::ProxyConfig;
4use crate::optimization::Optimizer;
5
6pub struct SftpDownloader {
7 url: String,
8 output: String,
9 quiet: bool,
10 proxy: ProxyConfig,
11 optimizer: Optimizer,
12}
13
14impl SftpDownloader {
15 pub fn new(url: String, output: String, quiet: bool, proxy: ProxyConfig, optimizer: Optimizer) -> Self {
16 Self {
17 url,
18 output,
19 quiet,
20 proxy,
21 optimizer,
22 }
23 }
24
25 pub fn download(&self) -> Result<(), Box<dyn Error + Send + Sync>> {
26 let tcp = std::net::TcpStream::connect(&self.url)?;
27 let mut sess = ssh2::Session::new()?;
28 sess.set_tcp_stream(tcp);
29 sess.handshake()?;
30
31 let sftp = sess.sftp()?;
32 let mut remote_file = sftp.open(std::path::Path::new(&self.url))?;
33 let mut contents = Vec::new();
34 remote_file.read_to_end(&mut contents)?;
35
36 std::fs::write(&self.output, contents)?;
37
38 if !self.quiet {
39 println!("Downloaded {} to {}", self.url, self.output);
40 }
41 Ok(())
42 }
43}