modio 0.13.0

Rust interface for integrating https://mod.io - a modding API for game developers
Documentation
use std::path::Path;

use futures_util::TryFutureExt;
use mime::Mime;
use reqwest::multipart::Part;
use reqwest::Body;
use tokio::fs::File;
use tokio::io::AsyncRead;
use tokio_util::io::ReaderStream;

pub struct FileSource {
    pub body: Body,
    pub filename: String,
    pub mime: Mime,
}

impl FileSource {
    pub fn new_from_file<P: AsRef<Path>>(file: P, filename: String, mime: Mime) -> Self {
        let file = file.as_ref().to_path_buf();
        let st = File::open(file)
            .map_ok(ReaderStream::new)
            .try_flatten_stream();

        FileSource {
            body: Body::wrap_stream(st),
            filename,
            mime,
        }
    }

    pub fn new_from_read<T>(read: T, filename: String, mime: Mime) -> Self
    where
        T: AsyncRead + Send + Sync + Unpin + 'static,
    {
        FileSource {
            body: Body::wrap_stream(ReaderStream::new(read)),
            filename,
            mime,
        }
    }
}

impl From<FileSource> for Part {
    fn from(source: FileSource) -> Part {
        Part::stream(source.body)
            .file_name(source.filename)
            .mime_str(source.mime.as_ref())
            .expect("FileSource::into::<Part>()")
    }
}