#variant #com #winapi #codec #windows

variant-rs

VARIANT support for Rust. Clean, idiomatic handling of WinAPI/COM results.

6 releases (3 breaking)

0.4.0 Feb 2, 2024
0.3.1 Apr 29, 2023
0.2.1 Jan 13, 2023
0.1.0 Jul 13, 2022

#562 in Data structures

Download history 260/week @ 2024-07-22 241/week @ 2024-07-29 359/week @ 2024-08-05 364/week @ 2024-08-12 204/week @ 2024-08-19 486/week @ 2024-08-26 111/week @ 2024-09-02 42/week @ 2024-09-09 96/week @ 2024-09-16 117/week @ 2024-09-23 308/week @ 2024-09-30 83/week @ 2024-10-07 163/week @ 2024-10-14 75/week @ 2024-10-21 73/week @ 2024-10-28 74/week @ 2024-11-04

395 downloads per month
Used in inline-vbs

MIT license

42KB
947 lines

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 = 123i32.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.clone().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 PSTR
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 BSTR &'static mut BSTR
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 Option<IUnknown> N/A
VT_DISPATCH Option<IDispatch> N/A
VT_VARIANT N/A PtrWrapper<VARIANT>

Wrapper types

ComBool

i16-backed enum.

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.4.0"

License

This project is licensed under either of

Dependencies

~129MB
~2M SLoC