cargo-stale 0.1.2

A fast, concurrent tool to check for outdated dependencies in your Rust Cargo.toml file
#[derive(Debug)]
pub struct VersionRequirement {
    pub operator: String,
    pub version: String,
}

pub fn parse_version_requirement(req: &str) -> Option<VersionRequirement> {
    let req = req.trim();

    if let Some(version) = req.strip_prefix("^") {
        Some(VersionRequirement {
            operator: "^".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix("~") {
        Some(VersionRequirement {
            operator: "~".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix("=") {
        Some(VersionRequirement {
            operator: "=".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix(">=") {
        Some(VersionRequirement {
            operator: ">=".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix("<=") {
        Some(VersionRequirement {
            operator: "<=".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix(">") {
        Some(VersionRequirement {
            operator: ">".to_string(),
            version: version.to_string(),
        })
    } else if let Some(version) = req.strip_prefix("<") {
        Some(VersionRequirement {
            operator: "<".to_string(),
            version: version.to_string(),
        })
    } else {
        Some(VersionRequirement {
            operator: "^".to_string(),
            version: req.to_string(),
        })
    }
}

pub fn parse_simple_version(version: &str) -> Option<(u32, u32, u32)> {
    let parts: Vec<&str> = version.split('.').collect();
    if parts.len() >= 3 {
        if let (Ok(major), Ok(minor), Ok(patch)) = (
            parts[0].parse::<u32>(),
            parts[1].parse::<u32>(),
            parts[2].parse::<u32>(),
        ) {
            return Some((major, minor, patch));
        }
    } else if parts.len() == 2 {
        if let (Ok(major), Ok(minor)) = (parts[0].parse::<u32>(), parts[1].parse::<u32>()) {
            return Some((major, minor, 0));
        }
    } else if parts.len() == 1 {
        if let Ok(major) = parts[0].parse::<u32>() {
            return Some((major, 0, 0));
        }
    }
    None
}