pub struct FSUtil {
read_file: fn(path: &str) -> Option<String>,
file_exists: fn(path: &str) -> bool,
file_is_directory: fn(path: &str) -> bool,
path_join: fn(base: &str, path: &str) -> String,
parent_directory: fn(path: &str) -> String,
path_is_absolute: fn(path: &str) -> bool,
}
impl FSUtil {
pub fn new(
read_file: fn(path: &str) -> Option<String>,
file_exists: fn(path: &str) -> bool,
file_is_directory: fn(path: &str) -> bool,
path_join: fn(base: &str, path: &str) -> String,
parent_directory: fn(path: &str) -> String,
path_is_absolute: fn(path: &str) -> bool,
) -> Self {
Self {
read_file,
file_exists,
file_is_directory,
path_join,
parent_directory,
path_is_absolute,
}
}
pub fn read_file(&self, path: &str) -> Option<String> {
(self.read_file)(path)
}
pub fn file_exists(&self, path: &str) -> bool {
(self.file_exists)(path)
}
pub fn file_is_directory(&self, path: &str) -> bool {
(self.file_is_directory)(path)
}
pub fn path_join(&self, base: &str, path: &str) -> String {
(self.path_join)(base, path)
}
pub fn parent_directory(&self, path: &str) -> String {
(self.parent_directory)(path)
}
pub fn path_is_absolute(&self, path: &str) -> bool {
(self.path_is_absolute)(path)
}
pub fn import_path(&self, source_path: &str, path: &str) -> String {
self.path_join(&self.parent_directory(source_path), path)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn read_file(path: &str) -> Option<String> {
match path {
"exists" => Some("content".to_owned()),
_ => None,
}
}
fn file_exists(path: &str) -> bool {
path == "exists"
}
fn file_is_directory(path: &str) -> bool {
path == "directory"
}
fn path_join(base: &str, path: &str) -> String {
format!("{}/{}", base, path)
}
fn parent_directory(path: &str) -> String {
match path {
"hasParent" => "parent".to_owned(),
_ => "".to_owned(),
}
}
fn path_is_absolute(path: &str) -> bool {
path.starts_with("/")
}
static FS_UTIL: FSUtil = FSUtil {
read_file,
file_exists,
file_is_directory,
path_join,
parent_directory,
path_is_absolute,
};
#[test]
fn read_file_calls_the_argument_function() {
assert_eq!(FS_UTIL.read_file("exists"), Some("content".to_owned()));
assert_eq!(FS_UTIL.read_file("not_exists"), None);
}
#[test]
fn file_exists_calls_the_argument_function() {
assert!(FS_UTIL.file_exists("exists"));
assert!(!FS_UTIL.file_exists("not_exists"));
}
#[test]
fn file_is_directory_calls_the_argument_function() {
assert!(FS_UTIL.file_is_directory("directory"));
assert!(!FS_UTIL.file_is_directory("file"));
}
#[test]
fn path_join_calls_the_argument_function() {
assert_eq!(FS_UTIL.path_join("base", "path"), "base/path");
}
#[test]
fn parent_directory_calls_the_argument_function() {
assert_eq!(FS_UTIL.parent_directory("hasParent"), "parent");
assert_eq!(FS_UTIL.parent_directory("noParent"), "");
}
#[test]
fn path_is_absolute_calls_the_argument_function() {
assert!(FS_UTIL.path_is_absolute("/home/user"));
assert!(!FS_UTIL.path_is_absolute("home/user"));
}
#[test]
fn import_path_calls_parent_directory_and_path_join() {
assert_eq!(FS_UTIL.import_path("hasParent", "path"), "parent/path");
assert_eq!(FS_UTIL.import_path("noParent", "path"), "/path");
}
}