Crate stdext[][src]

Expand description

Additional features for the Rust standard library.

Description

This crate contains enhancements to the Rust standard library types, useful for broad audience, but not yet implemented (or stabilized) in std.

Crate is designed to be lightweight (no external dependencies!) and provide essential functionality which possible can get to the std some day.

Extension traits

All the new functionality the stanard library is added using extension traits.

Below you can find the table of all the extension traits introduced by this crate:

std structureextension traits
VecVecExt and VecExtClone
&strStrExt
OptionOptionExt
ResultResultExt
DurationDurationExt
RwLockRwLockExt
MutexMutexExt
f32 and f64FloatConvert

Integer super-trait

While all built-in integer types have mostly the same interface, it’s not backed by any trait, which makes it impossible to write a function that will accept any built-in integer.

Integer trait solves that problem by reflecting the common interface of all the built-in integers.

Macros

Another group of extensions in stdext is new macros:

Highlights

  • Convenient builder methods for Duration:

    use std::time::Duration;
    use stdext::prelude::*;
    
    let duration = Duration::from_minutes(1).add_secs(5).add_micros(100);
    assert_eq!(duration, Duration::new(65, 100_000));
  • Panicking version for RwLock::read, RwLock::write and Mutex::lock (for fellows who don’t really handle the lock poisoning):

    use std::sync::{Arc, RwLock};
    use stdext::prelude::*;
     
    let lock = Arc::new(RwLock::new(1));
    {
        let mut n = lock.force_write(); // Instead of `.write().unwrap()`.
        *n = 2;
    }
    let n = lock.force_read();
    assert_eq!(*n, 2);
  • Result::combine and Option::combine to zip pairs of objects:

    use stdext::prelude::*;
     
    let x = Some(1);
    let y = Some("hi");
    let z = None::<u8>;
     
    assert_eq!(x.combine(y), Some((1, "hi")));
    assert_eq!(x.combine(z), None);
    
    let x = Ok(1);
    let y = Ok("hi");
    let z: Result<i32, &str> = Err("error");
    let z2: Result<i32, &str> = Err("other_error");
    
    assert_eq!(x.combine(y), Ok((1, "hi")));
    assert_eq!(x.combine(z), Err("error"));
    assert_eq!(z.combine(z2), Err("error"));
  • New handy macros (mostly for development purposes):

    use stdext::{compile_warning, function_name};
    
    fn sample_function() {
      println!("This function is called {}", function_name!());
    
      compile_warning!("This function must do something else...");
    }

Modules

duration

Extension traits for std::time::Duration.

macros

Various helper macros.

num

Extensions for the built-in numeric types.

option

Extension traits for std::Option.

prelude

A “prelude” module which re-exports all the extension traits for the simple library usage.

result

Extension traits for std::Result.

str

Extension traits for str primitive type.

sync

Extension traits for the standard synchronization primitives.

vec

Extension traits for std::Vec.

Macros

compile_warning

compile_warning macro is a brother of std::compile_error, which emits a compile-time warning with a provided message.

function_name

This macro returns the name of the enclosing function. As the internal implementation is based on the std::any::type_name, this macro derives all the limitations of this function.

return_ok

Checks whether supplied Result variable is Ok and if so, returns it.

return_some

Checks whether supplied Option variable is Some and if so, returns it.

try_match

Attempts to get variant from the enum variable.

unwrap_match

Similar to try_match but additionally unwraps the result.