diff --git a/src/script.rs b/src/script.rs index c72785f..5288cca 100644 --- a/src/script.rs +++ b/src/script.rs @@ -1,10 +1,59 @@ +use std::fs; use std::path::PathBuf; pub fn _get_script_base_path(base: &PathBuf, file_name: &str) -> PathBuf { - let mut file_name_chars = file_name.chars(); - let path = base.join(file_name_chars.next().unwrap_or('_').to_string()) - .join(file_name_chars.next().unwrap_or('_').to_string()) - .join(file_name_chars.next().unwrap_or('_').to_string()) + let mut fn_chars = file_name.chars().take_while(|c| *c != '.'); + let path = base.join(fn_chars.next().unwrap_or('_').to_string()) + .join(fn_chars.next().unwrap_or('_').to_string()) + .join(fn_chars.next().unwrap_or('_').to_string()) .join(file_name); path } + +pub fn _list_versions(script_base_path: &PathBuf) -> Vec<(PathBuf, String)> { + let mut ret = vec![]; + match fs::read_dir(script_base_path) { + Err(e) => error!("Read dir: {:?}, error: {}", script_base_path, e), + Ok(paths) => for path in paths { + match path { + Err(e) => error!("List dir: {:?}, error: {}", script_base_path, e), + Ok(path) => if path.path().is_dir() { + trace!("Found dir: {:?}", path); + match path.file_name().to_str() { + None => error!("Get path file name: {:?}, is none", path), + Some(file_name) => if file_name.starts_with("v") { + let ver = get_dir_ver(&file_name); + ret.push((path.path(), ver)); + }, + } + }, + } + }, + } + ret +} + +fn get_dir_ver(dir_name: &str) -> String { + dir_name.chars().skip_while(|c| *c != '-').skip(1).collect::() +} + +#[test] +fn test_get_dir_ver() { + assert_eq!("".to_owned(), get_dir_ver("")); + assert_eq!("".to_owned(), get_dir_ver("v0001")); + assert_eq!("".to_owned(), get_dir_ver("v00011.0")); + assert_eq!("0.0.1".to_owned(), get_dir_ver("v0001-0.0.1")); + assert_eq!("1.0.1".to_owned(), get_dir_ver("v0001-1.0.1")); +} + +#[test] +fn test_get_script_base_path() { + use std::str::FromStr; + let base = PathBuf::from_str("/sample").unwrap(); + let script_base_path = _get_script_base_path(&base, "s.crs"); + assert_eq!(PathBuf::from_str("/sample/s/_/_/s.crs").unwrap(), script_base_path); + let script_base_path = _get_script_base_path(&base, "sa.crs"); + assert_eq!(PathBuf::from_str("/sample/s/a/_/sa.crs").unwrap(), script_base_path); + let script_base_path = _get_script_base_path(&base, "sample.crs"); + assert_eq!(PathBuf::from_str("/sample/s/a/m/sample.crs").unwrap(), script_base_path); +} \ No newline at end of file