sys_traits
Trait per function for system related functionality.
Write functions that specify only the system functions they need.
use FsWriteFile;
use SystemRandom;
Now a caller only needs to provide a type that implements those two functions.
#[sys_traits::auto_impl]
Use the #[sys_traits::auto_impl] macro to reduce boilerplate when wanting to
automatically implement a trait for T when T implements the required traits.
This is useful for aliasing and reducing verbosity when using this crate.
+#[sys_traits::auto_impl]
pub trait WriteRandomDataSys: FsWriteFile + SystemRandom
{
}
-impl<T> DenoResolverSys for T where T: FsWriteFile + SystemRandom
-{
-}
Implementations
Comes with two implementations that implement all the traits.
sys_traits::impl::RealSys- A real implementation of the current system.- Automatically works with Wasm in Deno
- Will implement Node.js support once I need it (https://github.com/dsherret/sys_traits/issues/4)
sys_traits::impl::InMemorySys- An in-memory system useful for testing.
Creating an implementation
To create an implementation you must implement the traits; however, some traits
require implementing Base<TraitName> traits instead. For example, instead of
implementing FsWrite, you must implement BaseFsWrite:
;
The sys_traits::FsWrite trait gets automatically implemented for this as its
definition is:
There's two reasons for this:
- You can't box traits with
impl .... - By design it limits code generation of multiple kinds of
impl AsRef<Path>andimpl AsRef<[u8]>to only being a single statement.
Error Context
By default, filesystem errors don't include path information:
No such file or directory (os error 2)
Use .with_paths_in_errors() to wrap operations with context that includes the
operation name and path:
use PathsInErrorsExt;
use RealSys;
let sys = RealSys;
// returns: "failed to read '/path/to/file': No such file or directory (os error 2)"
sys.with_paths_in_errors.fs_read?;
The returned io::Error preserves the original error kind and can be downcast
to OperationError for programmatic access:
use OperationError;
use OperationErrorKind;
let err = sys.with_paths_in_errors.fs_read.unwrap_err;
// error kind is preserved
assert_eq!;
// downcast for programmatic access
if let Some = err.get_ref.and_then