From f255c44dfae61655c7e1e909d66d6b2a8eb8054b Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Mon, 8 Apr 2024 20:38:34 +0100 Subject: [PATCH] feat: Replace own filesystem module with kxio lib The filesystem, and the intended network module have been extracted into their own library as they are used by more than one project, so they can now be developed independently and updates shared. Closes kemitix/git-next#9 --- src/filesystem.rs | 151 ---------------------------------------------- src/main.rs | 2 +- 2 files changed, 1 insertion(+), 152 deletions(-) delete mode 100644 src/filesystem.rs diff --git a/src/filesystem.rs b/src/filesystem.rs deleted file mode 100644 index 2170b45f..00000000 --- a/src/filesystem.rs +++ /dev/null @@ -1,151 +0,0 @@ -#![allow(unused)] - -use std::{ - ops::Deref, - path::PathBuf, - sync::{Arc, Mutex}, -}; - -use tempfile::{tempdir, TempDir}; -use tracing::info; - -#[derive(Clone, Debug)] -pub enum FileSystem { - Real(RealFileSystemEnv), - Temp(TempFileSystemEnv), -} -impl FileSystem { - pub fn new_real(cwd: Option) -> Self { - let cwd = cwd.unwrap_or_default(); - Self::Real(RealFileSystemEnv::new(cwd)) - } - pub fn new_temp() -> std::io::Result { - TempFileSystemEnv::new().map(Self::Temp) - } -} -impl Deref for FileSystem { - type Target = dyn FileSystemEnv; - - fn deref(&self) -> &Self::Target { - match self { - Self::Real(env) => env, - Self::Temp(env) => env, - } - } -} - -pub trait FileSystemEnv: Sync + Send + std::fmt::Debug { - fn cwd(&self) -> &PathBuf; - - fn in_cwd(&self, name: &str) -> PathBuf { - self.cwd().join(name) - } - - fn write_file(&self, file_name: &str, content: &str) -> std::io::Result { - use std::fs::File; - use std::io::{LineWriter, Write}; - - let path = self.in_cwd(file_name); - info!("writing to {:?}", path); - let file = File::create(path.clone())?; - let mut file = LineWriter::new(file); - file.write_all(content.as_bytes())?; - Ok(path) - } - - fn file_exists(&self, name: &PathBuf) -> bool { - use std::fs::File; - File::open(name).is_ok() - } - - fn read_file(&self, file_name: &str) -> std::io::Result { - use std::fs::File; - use std::io::Read; - - let path = self.in_cwd(file_name); - info!("reading from {:?}", path); - let mut file = File::open(path)?; - let mut content = String::new(); - file.read_to_string(&mut content)?; - Ok(content) - } -} - -#[derive(Clone, Debug, Default)] -pub struct RealFileSystemEnv { - cwd: PathBuf, -} - -#[derive(Clone, Debug)] -pub struct TempFileSystemEnv { - cwd: PathBuf, - temp_dir: Arc>, -} - -impl FileSystemEnv for TempFileSystemEnv { - fn cwd(&self) -> &PathBuf { - &self.cwd - } -} - -impl FileSystemEnv for RealFileSystemEnv { - fn cwd(&self) -> &PathBuf { - &self.cwd - } -} - -impl RealFileSystemEnv { - const fn new(cwd: PathBuf) -> Self { - Self { cwd } - } -} - -impl TempFileSystemEnv { - fn new() -> std::io::Result { - let temp_dir = tempdir()?; - info!("temp dir: {:?}", temp_dir.path()); - let cwd = temp_dir.path().to_path_buf(); - let temp_dir = Arc::new(Mutex::new(temp_dir)); - Ok(Self { cwd, temp_dir }) - } -} - -#[cfg(test)] -mod tests { - - use super::*; - - use std::path::PathBuf; - - #[test_log::test] - fn test_cwd() { - let cwd = PathBuf::from("/tmp"); - let env = RealFileSystemEnv::new(cwd.clone()); - assert_eq!(env.cwd(), &cwd); - } - - #[test_log::test] - fn test_create_on_temp_fs() -> std::io::Result<()> { - let env = TempFileSystemEnv::new()?; - assert!(env.cwd().exists()); - Ok(()) - } - - #[test_log::test] - fn test_create_on_real_fs() { - let cwd = PathBuf::from("/tmp"); - let env = RealFileSystemEnv::new(cwd.clone()); - assert_eq!(env.cwd(), &cwd); - } - - #[test_log::test] - fn test_write_and_read_file() -> std::io::Result<()> { - let env = TempFileSystemEnv::new()?; - let file_name = "test.txt"; - let content = "Hello, World!"; - let path = env.write_file(file_name, content)?; - assert_eq!(env.read_file(file_name)?, content); - assert!(path.exists()); - Ok(()) - } -} diff --git a/src/main.rs b/src/main.rs index 5b889533..eb809ad2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ -mod filesystem; mod init; mod server; use clap::Parser; +use kxio::filesystem; #[derive(Parser, Debug)] #[clap(version = clap::crate_version!(), author = clap::crate_authors!(), about = clap::crate_description!())]