floppy-disk 0.1.4

async filesystem facade for rust!
Documentation
# floppy-disk

*floppy disk* is a WIP, async-only filesystem facade for Rust.

## What?

Have you ever worked with `std::fs`? `tokio::fs`? Then you've probably realised
that testing filesystem code is difficult and sometimes scary. Is that
`fs::remove_dir_all` *really* safe to run?

The point of *floppy disk* is to fix this. Rather than always using the real
filesystem, *floppy disk* lets you choose a backend for your filesystem access,
via the `FloppyDisk` trait. Current implementations include in-memory and real
filesystem via Tokio. This way, you can use the real filesystem when you need,
but have your tests hit a fake in-memory filesystem instead.

## Features

- Pluggable filesystem backends
  - In-memory (WIP)
  - Tokio
- Write-your-own with the `FloppyDisk` trait
- Fully-async
  - Light evil involved

### Caveats

- ***floppy disk* is a 0.x.y project!** You probably don't want to use it in
  production.
- async-only! There is some small bridging to sync code, like `MemFile`
  implementing `Read`/`Write`/`Seek`, but this is mostly a hack to make
  working with sync-only external libraries (ex. `ar`) easier.
- in-memory fs may not be performant-enough

## Example usage

*floppy disk* attempts to recreate the `std::fs` API 1:1, with the caveat of
being async-only.

```rust
let fs = ...; // MemFloppyDisk::new() | TokioFloppyDisk::new()
fs.create_dir_all("/foo/bar").await?;
fs.write("/foo/bar/baz.txt", b"hello world").await?;
let contents = fs.read_to_string("/foo/bar/baz.txt").await?;
assert_eq!(contents, "hello world");
```

Passing a `FloppyDisk` around:

```rust
struct MyStruct<'a, F: FloppyDisk<'a>> {
    fs: F,
    _marker: PhantomData<&'a ()>,
}

async fn my_fn<'a, F: FloppyDisk<'a>> {
   // ...
}
```