krates 0.1.0

Create graphs of crates gathered from cargo metadata
Documentation
#[test]
fn iter_names() {
    let contents = std::fs::read_to_string("tests/all-features.json")
        .map_err(|e| format!("failed to load metadata file: {}", e))
        .unwrap();

    let md: krates::cm::Metadata = serde_json::from_str(&contents)
        .map_err(|e| format!("failed to deserialize metadata: {}", e))
        .unwrap();

    let krates: krates::Krates = krates::Builder::new()
        .build_with_metadata(md, |_| {})
        .unwrap();

    let mut iter = krates.krates_by_name("winapi");

    let win28 = iter.next().unwrap();
    assert_eq!(win28.1.krate.name, "winapi");
    assert_eq!(
        win28.1.krate.version,
        krates::semver::Version::parse("0.2.8").unwrap()
    );

    let win38 = iter.next().unwrap();
    assert_eq!(win38.1.krate.name, "winapi");
    assert_eq!(
        win38.1.krate.version,
        krates::semver::Version::parse("0.3.8").unwrap()
    );

    assert!(iter.next().is_none());

    let mut iter = krates.krates_by_name("a");

    let a = iter.next().unwrap();
    assert_eq!(a.1.krate.name, "a");
    assert_eq!(
        a.1.krate.version,
        krates::semver::Version::parse("0.1.0").unwrap()
    );

    assert!(iter.next().is_none());

    let mut iter = krates.krates_by_name("winapi-x86_64-pc-windows-gnu");

    let wingnu = iter.next().unwrap();
    assert_eq!(wingnu.1.krate.name, "winapi-x86_64-pc-windows-gnu");
    assert_eq!(
        wingnu.1.krate.version,
        krates::semver::Version::parse("0.4.0").unwrap()
    );

    assert!(iter.next().is_none());
}

#[test]
fn iter_matches() {
    let contents = std::fs::read_to_string("tests/all-features.json")
        .map_err(|e| format!("failed to load metadata file: {}", e))
        .unwrap();

    let md: krates::cm::Metadata = serde_json::from_str(&contents)
        .map_err(|e| format!("failed to deserialize metadata: {}", e))
        .unwrap();

    let krates: krates::Krates = krates::Builder::new()
        .build_with_metadata(md, |_| {})
        .unwrap();

    {
        let any = krates::semver::VersionReq::any();
        let mut iter = krates.search_matches("winapi", &any);

        let win28 = iter.next().unwrap();
        assert_eq!(win28.1.krate.name, "winapi");
        assert_eq!(
            win28.1.krate.version,
            krates::semver::Version::parse("0.2.8").unwrap()
        );

        let win38 = iter.next().unwrap();
        assert_eq!(win38.1.krate.name, "winapi");
        assert_eq!(
            win38.1.krate.version,
            krates::semver::Version::parse("0.3.8").unwrap()
        );

        assert!(iter.next().is_none());
    }

    {
        let two = krates::semver::VersionReq::parse("=0.2").unwrap();
        let mut iter = krates.search_matches("winapi", &two);

        let win28 = iter.next().unwrap();
        assert_eq!(win28.1.krate.name, "winapi");
        assert_eq!(
            win28.1.krate.version,
            krates::semver::Version::parse("0.2.8").unwrap()
        );

        assert!(iter.next().is_none());
    }

    {
        let grtr = krates::semver::VersionReq::parse(">0.2.8").unwrap();
        let mut iter = krates.search_matches("winapi", &grtr);

        let win38 = iter.next().unwrap();
        assert_eq!(win38.1.krate.name, "winapi");
        assert_eq!(
            win38.1.krate.version,
            krates::semver::Version::parse("0.3.8").unwrap()
        );

        assert!(iter.next().is_none());
    }

    {
        let none = krates::semver::VersionReq::parse("=0.4").unwrap();
        let mut iter = krates.search_matches("winapi", &none);

        assert!(iter.next().is_none());
    }
}