maybe-std

Helper crate for writing rust libraries with an optional dependency on the standard library.


License
CC-PDDC

Documentation

Maybe-std

A rust crate that helps writing libraries that work without alloc and/or std but can provide extra functionality if they are available. Writing such libraries involves some namespace-juggling which this crate takes care of. It exports all the items from core, alloc or std, depending on which features are enabled.

Usage

Depend on this crate by adding it to your Cargo.toml file:

[dependencies]
maybe-std = "0.1.0"
# If the library always requires the `alloc` crate, directly enable the feature:
# maybe-std = { version = "0.1.0", features = [ "alloc" ] }

Define the feature flags that control whether your library uses alloc and/or std, and forward them to the maybe_std crate:

[features]
alloc = [ "maybe-std/alloc" ] # Remove if the library always requires `alloc`
std = [ "maybe-std/std" ]

In the crate root, disable the standard library and import this crate - optionally rename it to something short to keep things more readable.

#![no_std]
extern crate maybe_std as base;

// `base` contains the same items as `core`, `alloc` or `std`, depending on
// the enabled features.

In all files, import the prelude:

use base::prelude::v1::*;

When using std functionality, gate it with #[cfg(feature = "std")], and when using alloc functionality that should be available even without std, gate it with #[cfg(any(feature = "alloc", feature = "std"))]:

#[cfg(feature = "std")]
pub const HOME: base::net::Ipv4Addr = base::net::Ipv4Addr::LOCALHOST;

#[cfg(any(feature = "alloc", feature = "std"))]
pub fn empty_string() -> String {
    String::new()
}

Accessing unstable functionality

By default, this crate does not export any unstable features of alloc. These can be enabled via the unstable feature flag.