diff options
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 121 |
1 files changed, 70 insertions, 51 deletions
diff --git a/src/utils.rs b/src/utils.rs index 597d9b6..4648903 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,19 +1,34 @@ use std::collections::HashSet; use std::env; use std::fs::{self, DirBuilder, File}; -use std::io::{self, BufReader, Read, Write}; -use std::num::ParseIntError; +use std::io::{BufReader, Read, Write}; use std::path::PathBuf; +use errors::*; use reqwest; use rss::Channel; +pub const UNABLE_TO_PARSE_REGEX: &'static str = "unable to parse regex"; +pub const UNABLE_TO_OPEN_FILE: &'static str = "unable to open file"; +pub const UNABLE_TO_CREATE_FILE: &'static str = "unable to create file"; +pub const UNABLE_TO_WRITE_FILE: &'static str = "unable to write file"; +pub const UNABLE_TO_READ_FILE_TO_STRING: &'static str = "unable to read file to string"; +pub const UNABLE_TO_READ_DIRECTORY: &'static str = "unable to read directory"; +pub const UNABLE_TO_READ_ENTRY: &'static str = "unable to read entry"; +pub const UNABLE_TO_CREATE_DIRECTORY: &'static str = "unable to create directory"; +pub const UNABLE_TO_READ_RESPONSE_TO_END: &'static str = "unable to read response to end"; +pub const UNABLE_TO_GET_HTTP_RESPONSE: &'static str = "unable to get http response"; +pub const UNABLE_TO_CONVERT_TO_STR: &'static str = "unable to convert to &str"; +pub const UNABLE_TO_REMOVE_FILE: &'static str = "unable to remove file"; +pub const UNABLE_TO_CREATE_CHANNEL_FROM_RESPONSE: &'static str = + "unable to create channel from http response"; +pub const UNABLE_TO_CREATE_CHANNEL_FROM_FILE: &'static str = + "unable to create channel from xml file"; +pub const UNABLE_TO_RETRIEVE_PODCAST_BY_TITLE: &'static str = "unable to retrieve podcast by title"; pub fn trim_extension(filename: &str) -> Option<String> { let name = String::from(filename); - match name.rfind('.') { - Some(index) => Some(String::from(&name[0..index])), - None => None, - } + let index = name.rfind('.')?; + Some(String::from(&name[0..index])) } pub fn find_extension(input: &str) -> Option<&str> { @@ -33,35 +48,42 @@ pub fn find_extension(input: &str) -> Option<&str> { } } -pub fn create_directories() -> Result<(), String> { - let mut path = get_podcast_dir(); - path.push(".rss"); - if let Err(err) = DirBuilder::new().recursive(true).create(&path) { - return Err(format!( - "Couldn't create directory: {}\nReason: {}", - path.to_str().unwrap(), - err - )); +pub fn get_podcast_dir() -> Result<PathBuf> { + match env::var_os("PODCAST") { + Some(val) => Ok(PathBuf::from(val)), + None => { + let mut path = env::home_dir().chain_err(|| "Couldn't find your home directory")?; + path.push("Podcasts"); + Ok(path) + } } - Ok(()) } -pub fn already_downloaded(dir: &str) -> Result<HashSet<String>, io::Error> { +pub fn create_directories() -> Result<()> { + let mut path = get_podcast_dir()?; + path.push(".rss"); + DirBuilder::new() + .recursive(true) + .create(&path) + .chain_err(|| "unable to create directory") +} + +pub fn already_downloaded(dir: &str) -> Result<HashSet<String>> { let mut result = HashSet::new(); - let mut path = get_podcast_dir(); + let mut path = get_podcast_dir()?; path.push(dir); - let entries = fs::read_dir(path)?; + let entries = fs::read_dir(path).chain_err(|| "unable to read directory")?; for entry in entries { - let entry = entry?; + let entry = entry.chain_err(|| "unable to read entry")?; match entry.file_name().into_string() { Ok(name) => { - let index = name.find('.').unwrap(); + let index = name.find('.').chain_err(|| "unable to find string index")?; result.insert(String::from(&name[0..index])); } Err(_) => { - println!( + eprintln!( "OsString: {:?} couldn't be converted to String", entry.file_name() ); @@ -71,46 +93,41 @@ pub fn already_downloaded(dir: &str) -> Result<HashSet<String>, io::Error> { Ok(result) } -pub fn get_podcast_dir() -> PathBuf { - match env::var_os("PODCAST") { - Some(val) => PathBuf::from(val), - None => { - let mut path = env::home_dir().expect("Couldn't find your home directory"); - path.push("Podcasts"); - path - } - } -} - -pub fn get_sub_file() -> PathBuf { - let mut path = get_podcast_dir(); +pub fn get_sub_file() -> Result<PathBuf> { + let mut path = get_podcast_dir()?; path.push(".subscriptions"); - path + Ok(path) } -pub fn get_xml_dir() -> PathBuf { - let mut path = get_podcast_dir(); +pub fn get_xml_dir() -> Result<PathBuf> { + let mut path = get_podcast_dir()?; path.push(".rss"); - path + Ok(path) } -pub fn download_rss_feed(url: &str) -> Result<Channel, String> { - let mut path = get_podcast_dir(); +pub fn download_rss_feed(url: &str) -> Result<Channel> { + let mut path = get_podcast_dir()?; path.push(".rss"); - DirBuilder::new().recursive(true).create(&path).unwrap(); - let mut resp = reqwest::get(url).unwrap(); + DirBuilder::new() + .recursive(true) + .create(&path) + .chain_err(|| "unable to open directory")?; + let mut resp = reqwest::get(url).chain_err(|| "unable to open url")?; let mut content: Vec<u8> = Vec::new(); - resp.read_to_end(&mut content).unwrap(); - let channel = Channel::read_from(BufReader::new(&content[..])).unwrap(); + resp.read_to_end(&mut content) + .chain_err(|| "unable to read http response to end")?; + let channel = Channel::read_from(BufReader::new(&content[..])) + .chain_err(|| "unable to create channel from xml http response")?; let mut filename = String::from(channel.title()); filename.push_str(".xml"); path.push(filename); - let mut file = File::create(&path).unwrap(); - file.write_all(&content).unwrap(); + let mut file = File::create(&path).chain_err(|| "unable to create file")?; + file.write_all(&content) + .chain_err(|| "unable to write file")?; Ok(channel) } -pub fn parse_download_episodes(e_search: &str) -> Result<Vec<usize>, ParseIntError> { +pub fn parse_download_episodes(e_search: &str) -> Result<Vec<usize>> { let input = String::from(e_search); let mut ranges = Vec::<(usize, usize)>::new(); let mut elements = Vec::<usize>::new(); @@ -119,11 +136,13 @@ pub fn parse_download_episodes(e_search: &str) -> Result<Vec<usize>, ParseIntErr let temp = String::from(elem); if temp.contains('-') { let range: Vec<usize> = elem.split('-') - .map(|i| i.parse::<usize>().unwrap()) - .collect(); + .map(|i| i.parse::<usize>().chain_err(|| "unable to parse number")) + .collect::<Result<Vec<usize>>>() + .chain_err(|| "unable to collect ranges")?; ranges.push((range[0], range[1])); } else { - elements.push(elem.parse::<usize>()?); + elements.push(elem.parse::<usize>() + .chain_err(|| "unable to parse number")?); } } |
