From 9b9dc43a7f401b578b1960137c99c2355cf50984 Mon Sep 17 00:00:00 2001 From: ChristianVisintin Date: Thu, 24 Dec 2020 10:03:48 +0100 Subject: [PATCH] FileTransferProtocol ToString and FromStr traits --- src/filetransfer/mod.rs | 77 ++++++++++++++++++++++++++++++++++ src/system/bookmarks_client.rs | 27 ++++-------- 2 files changed, 86 insertions(+), 18 deletions(-) diff --git a/src/filetransfer/mod.rs b/src/filetransfer/mod.rs index 243573c..0c04f7d 100644 --- a/src/filetransfer/mod.rs +++ b/src/filetransfer/mod.rs @@ -226,6 +226,34 @@ pub trait FileTransfer { fn on_recv(&mut self, readable: Box) -> Result<(), FileTransferError>; } +// Traits + +impl std::string::ToString for FileTransferProtocol { + fn to_string(&self) -> String { + String::from(match self { + FileTransferProtocol::Ftp(secure) => match secure { + true => "FTPS", + false => "FTP", + }, + FileTransferProtocol::Scp => "SCP", + FileTransferProtocol::Sftp => "SFTP", + }) + } +} + +impl std::str::FromStr for FileTransferProtocol { + type Err = (); + fn from_str(s: &str) -> Result { + match s.to_ascii_uppercase().as_str() { + "FTP" => Ok(FileTransferProtocol::Ftp(false)), + "FTPS" => Ok(FileTransferProtocol::Ftp(true)), + "SCP" => Ok(FileTransferProtocol::Scp), + "SFTP" => Ok(FileTransferProtocol::Sftp), + _ => Err(()), + } + } +} + // Tests #[cfg(test)] @@ -233,6 +261,9 @@ mod tests { use super::*; + use std::str::FromStr; + use std::string::ToString; + #[test] fn test_filetransfer_mod_protocol() { assert_eq!( @@ -243,6 +274,52 @@ mod tests { FileTransferProtocol::Ftp(false), FileTransferProtocol::Ftp(false) ); + // From str + assert_eq!( + FileTransferProtocol::from_str("FTPS").ok().unwrap(), + FileTransferProtocol::Ftp(true) + ); + assert_eq!( + FileTransferProtocol::from_str("ftps").ok().unwrap(), + FileTransferProtocol::Ftp(true) + ); + assert_eq!( + FileTransferProtocol::from_str("FTP").ok().unwrap(), + FileTransferProtocol::Ftp(false) + ); + assert_eq!( + FileTransferProtocol::from_str("ftp").ok().unwrap(), + FileTransferProtocol::Ftp(false) + ); + assert_eq!( + FileTransferProtocol::from_str("SFTP").ok().unwrap(), + FileTransferProtocol::Sftp + ); + assert_eq!( + FileTransferProtocol::from_str("sftp").ok().unwrap(), + FileTransferProtocol::Sftp + ); + assert_eq!( + FileTransferProtocol::from_str("SCP").ok().unwrap(), + FileTransferProtocol::Scp + ); + assert_eq!( + FileTransferProtocol::from_str("scp").ok().unwrap(), + FileTransferProtocol::Scp + ); + // Error + assert!(FileTransferProtocol::from_str("dummy").is_err()); + // To String + assert_eq!( + FileTransferProtocol::Ftp(true).to_string(), + String::from("FTPS") + ); + assert_eq!( + FileTransferProtocol::Ftp(false).to_string(), + String::from("FTP") + ); + assert_eq!(FileTransferProtocol::Scp.to_string(), String::from("SCP")); + assert_eq!(FileTransferProtocol::Sftp.to_string(), String::from("SFTP")); } #[test] diff --git a/src/system/bookmarks_client.rs b/src/system/bookmarks_client.rs index 0f6a297..191877c 100644 --- a/src/system/bookmarks_client.rs +++ b/src/system/bookmarks_client.rs @@ -37,6 +37,8 @@ use rand::{distributions::Alphanumeric, thread_rng, Rng}; use std::fs::{OpenOptions, Permissions}; use std::io::{Read, Write}; use std::path::{Path, PathBuf}; +use std::str::FromStr; +use std::string::ToString; use std::time::SystemTime; /// ## BookmarksClient @@ -112,11 +114,9 @@ impl BookmarksClient { Some(( entry.address.clone(), entry.port, - match entry.protocol.to_ascii_uppercase().as_str() { - "FTP" => FileTransferProtocol::Ftp(false), - "FTPS" => FileTransferProtocol::Ftp(true), - "SCP" => FileTransferProtocol::Scp, - _ => FileTransferProtocol::Sftp, + match FileTransferProtocol::from_str(entry.protocol.as_str()) { + Ok(proto) => proto, + Err(_) => FileTransferProtocol::Sftp, // Default }, entry.username.clone(), match &entry.password { @@ -172,11 +172,9 @@ impl BookmarksClient { Some(( entry.address.clone(), entry.port, - match entry.protocol.to_ascii_uppercase().as_str() { - "FTP" => FileTransferProtocol::Ftp(false), - "FTPS" => FileTransferProtocol::Ftp(true), - "SCP" => FileTransferProtocol::Scp, - _ => FileTransferProtocol::Sftp, + match FileTransferProtocol::from_str(entry.protocol.as_str()) { + Ok(proto) => proto, + Err(_) => FileTransferProtocol::Sftp, // Default }, entry.username.clone(), )) @@ -333,14 +331,7 @@ impl BookmarksClient { address: addr, port, username, - protocol: match protocol { - FileTransferProtocol::Ftp(secure) => match secure { - true => String::from("FTPS"), - false => String::from("FTP"), - }, - FileTransferProtocol::Scp => String::from("SCP"), - FileTransferProtocol::Sftp => String::from("SFTP"), - }, + protocol: protocol.to_string(), password: match password { Some(p) => Some(self.encrypt_str(p.as_str())), // Encrypt password if provided None => None,