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 #[allow(dead_code)]
11 proxy: ProxyConfig,
12 #[allow(dead_code)]
13 optimizer: Optimizer,
14}
15
16impl SftpDownloader {
17 pub fn new(url: String, output: String, quiet: bool, proxy: ProxyConfig, optimizer: Optimizer) -> Self {
18 Self {
19 url,
20 output,
21 quiet,
22 proxy,
23 optimizer,
24 }
25 }
26
27 pub fn download(&self) -> Result<(), Box<dyn Error + Send + Sync>> {
28 let tcp = std::net::TcpStream::connect(&self.url)?;
29 let mut sess = ssh2::Session::new()?;
30 sess.set_tcp_stream(tcp);
31 sess.handshake()?;
32
33 let sftp = sess.sftp()?;
34 let mut remote_file = sftp.open(std::path::Path::new(&self.url))?;
35 let mut contents = Vec::new();
36 remote_file.read_to_end(&mut contents)?;
37
38 std::fs::write(&self.output, contents)?;
39
40 if !self.quiet {
41 println!("Downloaded {} to {}", self.url, self.output);
42 }
43 Ok(())
44 }
45}