mongodb 0.2.8

A native MongoDB driver developed under MongoDB labs.
Documentation
use mongodb::{Client, ThreadedClient};
use mongodb::common::ReadMode;
use mongodb::connstring::ConnectionString;
use mongodb::stream::StreamConnector;
use mongodb::topology::{TopologyDescription, TopologyType};
use mongodb::topology::server::Server;

use json::server_selection::reader::SuiteContainer;
use serde_json::Value;
use std::sync::{Arc, RwLock};

pub fn run_suite(file: &str) {
    let json = Value::from_file(file).unwrap();
    let suite = json.get_suite().unwrap();

    let dummy_config = ConnectionString::new("i-dont-exist", 27017);
    let dummy_client = Client::with_config(dummy_config, None, None).unwrap();
    let dummy_top_arc = Arc::new(RwLock::new(TopologyDescription::new(StreamConnector::default())));

    let mut topology_description = TopologyDescription::new(StreamConnector::default());
    topology_description.topology_type = suite.topology_description.ttype;

    for suite_server in suite.topology_description.servers {
        let server = Server::new(dummy_client.clone(),
                                 suite_server.host.clone(),
                                 dummy_top_arc.clone(),
                                 false,
                                 StreamConnector::default());

        {
            let mut description = server.description.write().unwrap();
            description.round_trip_time = Some(suite_server.rtt);
            description.tags = suite_server.tags;
            description.server_type = suite_server.stype;
        }

        topology_description.servers.insert(suite_server.host, server);
    }

    let (mut suitable_hosts, _) = if suite.write {
        topology_description.choose_write_hosts()
    } else {
        topology_description.choose_hosts(&suite.read_preference).unwrap()
    };

    if suite.topology_description.ttype != TopologyType::Sharded &&
       suite.topology_description.ttype != TopologyType::Single {
        topology_description.filter_hosts(&mut suitable_hosts, &suite.read_preference);
    }

    if suitable_hosts.is_empty() && !suite.write &&
       suite.read_preference.mode == ReadMode::SecondaryPreferred {
        let mut read_pref = suite.read_preference.clone();
        read_pref.mode = ReadMode::PrimaryPreferred;
        let (mut hosts, _) = topology_description.choose_hosts(&read_pref).unwrap();
        if suite.topology_description.ttype != TopologyType::Sharded &&
           suite.topology_description.ttype != TopologyType::Single {
            topology_description.filter_hosts(&mut hosts, &read_pref);
        }
        suitable_hosts.extend(hosts);
    }

    assert_eq!(suite.suitable_servers.len(), suitable_hosts.len());
    for server in &suite.suitable_servers {
        assert!(suitable_hosts.contains(&server.host));
    }

    topology_description.filter_latency_hosts(&mut suitable_hosts);
    assert_eq!(suite.in_latency_window.len(), suitable_hosts.len());
    for server in &suite.in_latency_window {
        assert!(suitable_hosts.contains(&server.host));
    }
}