From 425d1665171eda189c4a0d42db3e255810f844c7 Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Sun, 3 Nov 2024 11:36:20 +0000 Subject: [PATCH] feat(fs): add .reader().bytes() --- README.md | 2 +- justfile | 8 +++++--- src/fs/dir.rs | 10 +++------- src/fs/file.rs | 1 - src/fs/reader.rs | 17 +++++++++++++++++ tests/fs.rs | 21 +++++++++++++++++++++ 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8a6bfb8..6101895 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Provides injectable Filesystem and Network resources to make code more testable. - [x] `std::fs::create_dir_all` - `dir(path).create_all()` - Recursively create a directory and all of its parent components if they are missing. - [ ] `std::fs::hard_link` - `link(path)create()` - Creates a new hard link on the filesystem. - [ ] `std::fs::metadata` - `path(path).metadata()` - Given a path, query the file system to get information about a file, directory, etc. -- [ ] `std::fs::read` - `file(path).reader().bytes()` - Read the entire contents of a file into a bytes vector. +- [x] `std::fs::read` - `file(path).reader().bytes()` - Read the entire contents of a file into a bytes vector. - [x] `std::fs::read_dir` - `dir(path).read()` - Returns an iterator over the entries within a directory. - [ ] `std::fs::read_link` - `link(path).read()` - Reads a symbolic link, returning the file that the link points to. - [x] `std::fs::read_to_string` - `file(path).reader().to_string()` - Read the entire contents of a file into a string. diff --git a/justfile b/justfile index 38c5e65..235afc2 100644 --- a/justfile +++ b/justfile @@ -1,9 +1,11 @@ build: + #!/usr/bin/env bash + set -e cargo fmt cargo fmt --check - cargo hack --feature-powerset clippy - cargo hack --feature-powerset build - cargo hack --feature-powerset test + cargo hack clippy + cargo hack build + cargo hack test cargo doc install-hooks: diff --git a/src/fs/dir.rs b/src/fs/dir.rs index 377a2b2..34a97d6 100644 --- a/src/fs/dir.rs +++ b/src/fs/dir.rs @@ -2,7 +2,7 @@ use crate::fs::{DirItem, DirItemIterator, Result}; use super::{ - path::{DirMarker, PathReal}, DirHandle, Error, FileHandle, FileMarker, PathHandle, PathMarker + DirHandle, Error, FileHandle, PathHandle, }; impl<'base, 'path> DirHandle<'base, 'path> { @@ -64,9 +64,7 @@ impl<'base, 'path> DirHandle<'base, 'path> { impl<'base, 'path> TryFrom> for FileHandle<'base, 'path> { type Error = crate::fs::Error; - fn try_from( - path: PathHandle<'base, 'path>, - ) -> std::result::Result { + fn try_from(path: PathHandle<'base, 'path>) -> std::result::Result { match path.as_file() { Ok(Some(dir)) => Ok(dir.clone()), Ok(None) => Err(crate::fs::Error::NotADirectory { @@ -79,9 +77,7 @@ impl<'base, 'path> TryFrom> for FileHandle<'base, 'path impl<'base, 'path> TryFrom> for DirHandle<'base, 'path> { type Error = crate::fs::Error; - fn try_from( - path: PathHandle<'base, 'path>, - ) -> std::result::Result { + fn try_from(path: PathHandle<'base, 'path>) -> std::result::Result { match path.as_dir() { Ok(Some(dir)) => Ok(dir.clone()), Ok(None) => Err(crate::fs::Error::NotADirectory { diff --git a/src/fs/file.rs b/src/fs/file.rs index 9f55e62..3a2436b 100644 --- a/src/fs/file.rs +++ b/src/fs/file.rs @@ -2,7 +2,6 @@ use crate::fs::Result; use super::{ - path::{FileMarker, PathReal}, reader::Reader, Error, FileHandle, }; diff --git a/src/fs/reader.rs b/src/fs/reader.rs index 1b64784..ae45ee5 100644 --- a/src/fs/reader.rs +++ b/src/fs/reader.rs @@ -65,6 +65,23 @@ impl Reader { pub fn lines(&self) -> Lines<'_> { self.contents.lines() } + + /// Returns the contents of the file as bytes. + /// + /// ``` + /// # use kxio::fs::Result; + /// # fn main() -> Result<()> { + /// let fs = kxio::fs::temp()?; + /// let path = fs.base().join("foo"); + /// let file = fs.file(&path); + /// # file.write("new file contents")?; + /// let bytes = file.reader()?.bytes(); + /// # Ok(()) + /// # } + /// ``` + pub fn bytes(&self) -> &[u8] { + self.contents.as_bytes() + } } impl Display for Reader { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/tests/fs.rs b/tests/fs.rs index e830f50..9c2198f 100644 --- a/tests/fs.rs +++ b/tests/fs.rs @@ -403,3 +403,24 @@ mod copy { Ok(()) } } +mod reader { + use super::*; + mod bytes { + use super::*; + #[test] + fn should_return_bytes() -> TestResult { + let fs = fs::temp().expect("temp fs"); + let path = fs.base().join("foo"); + let file = fs.file(&path); + file.write("bar").expect("write"); + let reader = file.reader().expect("reader"); + let bytes = reader.bytes(); + assert_eq!(bytes.len(), 3); + assert_eq!(bytes[0], b'b'); + assert_eq!(bytes[1], b'a'); + assert_eq!(bytes[2], b'r'); + + Ok(()) + } + } +}