variant-rs 0.1.0

VARIANT support for Rust. Clean, idiomatic handling of WinAPI/COM results.
docs.rs failed to build variant-rs-0.1.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: variant-rs-0.4.0

variant-rs

Crates.io Crates.io License License

variant-rs is a Rust crate that provides idiomatic handling of COM VARIANT types. Rust supports discriminated union types out of the box, so although VARIANTs are usually a pain to work with, Rust makes it easy to encode and decode them.

The crate is designed to work with the VARIANT type from the winapi crate.

Basic usage

use variant_rs::*;

fn main() {
    let v1 = Variant::I32(123); // manual instanciation
    let v2 = 123.to_variant(); // ToVariant trait
    let v3 = 123.into(); // From / Into traits
    assert_eq!(v1, v2);
    assert_eq!(v1, v3);
  
    let bstr: Variant = "Hello, world!".into();
    let ptr: VARIANT = bstr.try_into().unwrap(); // convert to COM VARIANT
    let back: Variant = ptr.try_into().unwrap(); // convert back
    assert_eq!(bstr, back);
}

Supported VARIANT types and corresponding types

VARIANT type Rust type Rust type (BY_REF)
VT_EMPTY () N/A
VT_NULL () N/A
VT_I1 i8 &'static mut i8
VT_I2 i16 &'static mut i16
VT_I4 i32 &'static mut i32
VT_I8 i64 &'static mut i64
VT_UI1 u8 &'static mut u8
VT_UI2 u16 &'static mut u16
VT_UI4 u32 &'static mut u32
VT_UI8 u64 &'static mut u64
VT_INT i32 &'static mut i32
VT_UINT u32 &'static mut u32
VT_R4 f32 &'static mut f32
VT_R8 f64 &'static mut f64
VT_BOOL bool &'static mut ComBool
VT_BSTR String &'static mut ComString
VT_ERROR HRESULT (i32) &'static mut HRESULT (i32)
VT_CY Currency &'static mut ComCurrency
VT_DATE NaiveDateTime &'static mut ComDate
VT_DECIMAL Decimal &'static mut ComDecimal
VT_UNKNOWN PtrWrapper<IUnknown> N/A
VT_DISPATCH PtrWrapper<IDispatch> N/A
VT_VARIANT N/A PtrWrapper<VARIANT>

Wrapper types

ComBool

i16-backed enum.

ComString

Equivalent to BSTR (i32 length-prefixed, null-terminated string of 2-byte WCHARs). Encapsulates a *mut u16.

OwnedComString

Equivalent to above, owns the buffer and frees it when dropped.

ComCurrency

Maps COM's i64 currency data CY to Decimal.

ComDecimal

Maps COM's 96-bit decimals DECIMAL to Decimal.

ComData

Maps COM's DATE (f64 milliseconds from 1899-12-30) to NaiveDateTime.

PtrWrapper

Safe wrapper around COM interface pointers.

Installation

Add this to your Cargo.toml:

[dependencies]
variant-rs = "0.1"

License

This project is licensed under either of