filess 0.6.1

Simplified file management
Documentation
# Filess

Simplify file management with file primitives.

Use `filess` as you would use `String` or `Vec`.

Each file format is now a separate type, if your function needs json, you can put `filess::Json` as a filed, enforcing the proper path.

`Filess` simplifies saving and loading of data, with `serde`, `image` and `symphonia` optional integration.

```rust
let file1: Json = Json::new("path/to/file.json");   // Create new Json file. Filess will ensure that it's a valid path
let data: Vec<u8> = file1.load()?;                  // Load data from a file
let model = file1.load_model::<YourModel>()?;       // `Serde` integration: load model from the file
let model: YourModel = file1.load_model()?;         // Or like this
file1.save(&data)?;                                 // Save anything with `impl AsRef<[u8]>`
file1.save_model(&model)?;                          // `Serde` integration: save a model into file

let file2: Jpeg = Temporary::new(Jpeg::new("path/to/image.jpeg")); // Temporary file will be deleted together with it's empty parent dirs at `drop()`
let image: DynamicImage = file2.load_image()?;      // `Image` integration: load image of jpeg format from file
file2.save_image(&image)?;                          // `Image` integration: save `DynamicImage` with default compression parameters
// `Image` integration: save `DynamicImage` with custom quality parameters (only available if supports quality settings)
file2.save_image_custom(&image, JpegConfig { quality: 40 })?;

let file3 = Ogg::new("path/to/audio.ogg");          // `Symphonia` integration
let audio: DecodedStream<OggReader, DynamicDecoder> // DecodedStream gives you everything you need for use with `symphonia` and is served as source for `rodio`
    = file3.load_audio()?;                          // Saving is not support (yet). You can still use `file3.save(&data)` if you have compressed audio

let some_image = ImageType::new("path/to/image.webp"); // `File`, `Text`, `Model`, `Image` and `Audio` Types abstract away exact file types without overhead ov `Box<dyn>`
let img = some_image.load_image()?;
some_image.save_image(&img)?;

// Each function have their async variants (prefixed with `a`) if `async` feature is on
let image2 = file2.aload_image().await?;
Jpeg::new("another/path/image.jpeg").asave_image(&image2).await?;

// Enforce that file given should be able to save/load `serde` models. `ModelType` can also be passed
fn needs_model(file: impl filess::traits::ModelFile);
```

## Features

| Feature      | Description
|--------------|------------
| `all-files`  | (Default) All currently supported files, includes `all-text`, `all-images` and `all-audio`
| `all-text`   | All currently supported text files: `Json`, `Toml`, `Md`, `Txt`
| `all-images` | All currently supported image files: `Jpeg`, `Png`, `WebP`, `Avif`, `Tiff`, `Gif`, `Bmp`, `Exr`, `Ff`, `Hdr`, `Ico`, `Pnm`, `Qoi`, `Tga`
| `all-audio`  | All currently supported audio files: `Ogg`, `Mkv`, `Wav`, `Flac`, `Mp4`, `Mp3`, `Mp2`, `Mp1`, `Mpa`, `Alac`
| `serde`      | `Serde` integration, adds `save_model` and `load_model` for `Json` and `Toml`. Use `serde_json` and `serde_toml` to activate integrations for specific files (due to limitations of cargo)
| `image`      | `Image` integration, adds `save_image` and `load_image` to all image formats, and `save_image_custom` to formats where `image` supports custom quality
| `image-nasm` | Turns on `nasm` feature of `image`
| `audio`      | `Symphonia` integration, adds `load_audio` to all audio formats. Due to audio being complicated, `DecodedStream` is returned, which contains reader, decoder, track_id and helper methods
| `symphonia-simd`| Turns on `opt-simd` feature of `symphonia`
| `rodio`      | Adds minimal rodio integration, allowing `DecodedStream` to be directly passed as source
| `async`      | Add async versions of all methods. Uses minimal `tokio` for fs. Adds `asave_image_custom_offload` to offload image encoding
| `rayon`      | (Default) Turns on all of `rayon` features in crates that support it
| `open`       | (Default) Adds `open` integration. You can open files or directories in default or arbitrary programs (`open`, `open_with`, etc.)

All files have their separate features. It is recommended to turn off default features and add only formats you use, if you wish to publish.