gofer 0.2.0

Gofer.rs makes it easy to fetch data from any URL.
Documentation
// This is free and unencumbered software released into the public domain.

use crate::{Error, Read, RequestConfig, Result, Url, UrlScheme};

pub fn open(url: impl AsRef<str>) -> Result<Box<dyn Read>> {
    let url = url.as_ref().parse::<Url>()?;

    // TODO: look up the scheme in a protocol handler registry

    match url.scheme() {
        #[cfg(feature = "data")]
        UrlScheme::Data => crate::schemes::data::open(&url),

        #[cfg(feature = "file")]
        UrlScheme::File => crate::schemes::file::open(&url),

        #[cfg(feature = "ftp")]
        UrlScheme::Ftp => crate::schemes::ftp::open(&url, false),

        #[cfg(feature = "ftps")]
        UrlScheme::Ftps => crate::schemes::ftp::open(&url, true),

        #[cfg(feature = "git")]
        UrlScheme::Git => crate::schemes::git::open(&url),

        #[cfg(feature = "http")]
        UrlScheme::Http => crate::schemes::http::open(&url, false),

        #[cfg(feature = "https")]
        UrlScheme::Https => crate::schemes::http::open(&url, true),

        #[cfg(feature = "ipfs")]
        UrlScheme::Ipfs => crate::schemes::ipfs::open(&url),

        #[cfg(feature = "scp")]
        UrlScheme::Scp => crate::schemes::scp::open(&url),

        #[cfg(feature = "stdin")]
        UrlScheme::Stdin => crate::schemes::stdin::open(&url),

        _ => Err(Error::UnknownScheme(url.scheme_str().to_string())),
    }
}

pub fn open_with_config(url: impl AsRef<str>, config: RequestConfig) -> Result<Box<dyn Read>> {
    let url = url.as_ref().parse::<Url>()?;

    match url.scheme() {
        #[cfg(feature = "git")]
        UrlScheme::Git => crate::schemes::git::open_with_config(&url, config),

        #[cfg(feature = "http")]
        UrlScheme::Http => crate::schemes::http::open_with_config(&url, false, config),

        #[cfg(feature = "https")]
        UrlScheme::Https => crate::schemes::http::open_with_config(&url, true, config),

        #[cfg(feature = "ipfs")]
        UrlScheme::Ipfs => crate::schemes::ipfs::open_with_config(&url, config),

        _ => Err(Error::UnknownScheme(url.scheme_str().to_string())),
    }
}

#[cfg(feature = "std")]
pub fn open_buffered(url: impl AsRef<str>) -> Result<std::io::BufReader<Box<dyn Read>>> {
    Ok(std::io::BufReader::new(open(url)?))
}