mongodb 0.3.3

A native MongoDB driver developed under MongoDB labs.
Documentation
use bson::Bson;

pub trait NumEq {
    fn float_eq(&self, f: f64) -> bool;
    fn int_eq(&self, i: i64) -> bool;
}

#[cfg_attr(feature = "clippy", allow(cast_precision_loss))]
impl NumEq for Bson {
    fn float_eq(&self, f: f64) -> bool {
        match *self {
            Bson::FloatingPoint(ff) => ulps_eq!(ff, f),
            Bson::I32(i) => ulps_eq!(i as f64, f),
            Bson::I64(i) => ulps_eq!(i as f64, f),
            _ => false,
        }
    }

    fn int_eq(&self, i: i64) -> bool {
        match *self {
            Bson::FloatingPoint(f) => ulps_eq!(f, i as f64),
            Bson::I32(ii) => i == (ii as i64),
            Bson::I64(ii) => i == ii,
            _ => false,
        }
    }
}

pub fn bson_eq(b1: &Bson, b2: &Bson) -> bool {
    match *b1 {
        Bson::FloatingPoint(f) => b2.float_eq(f),
        Bson::I32(i) => b2.int_eq(i as i64),
        Bson::I64(i) => b2.int_eq(i),
        Bson::String(ref s) => var_match!(*b2, Bson::String(ref ss) => s == ss),
        Bson::Array(ref arr) => {
            var_match!(*b2, Bson::Array(ref other_arr) => {
            for val1 in arr {
                for val2 in other_arr {
                    if !bson_eq(val1, val2) {
                        return false
                    }
                }
            }
            true
        })
        }
        Bson::Document(ref doc) => {
            var_match!(*b2, Bson::Document(ref other_doc) => doc == other_doc)
        }
        Bson::Boolean(b) => var_match!(*b2, Bson::Boolean(bb) => b == bb),
        Bson::Null => var_match!(*b2, Bson::Null => true),
        Bson::RegExp(ref s1, ref s2) => {
            var_match!(*b2, Bson::RegExp(ref ss1, ref ss2) =>
                       s1 == ss1 && s2 == ss2)
        }
        Bson::JavaScriptCode(ref s) => var_match!(*b2, Bson::JavaScriptCode(ref ss) => s == ss),
        Bson::JavaScriptCodeWithScope(ref s, ref doc) => {
            var_match!(*b2, Bson::JavaScriptCodeWithScope(ref ss, ref other_doc) =>
                       s == ss && doc == other_doc)
        }
        Bson::TimeStamp(i) => var_match!(*b2, Bson::TimeStamp(ii) => i == ii),
        Bson::Binary(sub_ty, ref bits) => {
            var_match!(*b2, Bson::Binary(other_sub_ty, ref other_bits) =>
                       sub_ty == other_sub_ty && bits == other_bits)
        }
        Bson::ObjectId(ref bits) => {
            var_match!(*b2, Bson::ObjectId(ref other_bits) =>
                                                bits == other_bits)
        }
        Bson::UtcDatetime(date_time) => {
            var_match!(*b2, Bson::UtcDatetime(other_date_time) =>
                       date_time == other_date_time)
        }
        Bson::Symbol(ref s1) => var_match!(*b2, Bson::Symbol(ref s2) => s1 == s2),
    }
}