1pub mod ftp;
2pub mod http;
3pub mod local;
4pub mod ssh;
5pub mod url;
6pub mod watcher;
7
8pub use url::{parse as parse_url, Protocol, WatchTarget};
9pub use watcher::{
10 ConnectionState, PathWatcher, WatchError, WatchEvent, WatchEventKind, WatchOptions,
11};
12
13use std::path::Path;
14
15pub fn connect(url: &str, options: &WatchOptions) -> Result<Box<dyn PathWatcher>, WatchError> {
16 let target = url::parse(url)?;
17
18 match target.protocol {
19 Protocol::File => {
20 let path = Path::new(&target.path);
21 let watcher = local::LocalWatcher::new(path, options)?;
22 Ok(Box::new(watcher))
23 }
24 Protocol::Ssh | Protocol::Sftp | Protocol::Scp => {
25 let watcher = ssh::SshWatcher::connect(target, options)?;
26 Ok(Box::new(watcher))
27 }
28 Protocol::Ftp => {
29 let watcher = ftp::FtpWatcher::connect(target, options)?;
30 Ok(Box::new(watcher))
31 }
32 Protocol::Http | Protocol::Https => {
33 let watcher = http::HttpWatcher::connect(&target, options)?;
34 Ok(Box::new(watcher))
35 }
36 }
37}