Rename CrateName::version to version_req and change its type to

`Option<VersionReq>`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-08-07 18:40:24 +10:00
parent 51d6b3039b
commit dd8e6a400d
No known key found for this signature in database
GPG key ID: 591C0B03040416D6

View file

@ -1,19 +1,22 @@
use std::{convert::Infallible, fmt, str::FromStr}; use std::{fmt, str::FromStr};
use compact_str::CompactString; use compact_str::CompactString;
use itertools::Itertools; use itertools::Itertools;
use semver::{Error, VersionReq};
use super::parse_version;
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]
pub struct CrateName { pub struct CrateName {
pub name: CompactString, pub name: CompactString,
pub version: Option<CompactString>, pub version_req: Option<VersionReq>,
} }
impl fmt::Display for CrateName { impl fmt::Display for CrateName {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name)?; write!(f, "{}", self.name)?;
if let Some(version) = &self.version { if let Some(version) = &self.version_req {
write!(f, "@{version}")?; write!(f, "@{version}")?;
} }
@ -22,18 +25,18 @@ impl fmt::Display for CrateName {
} }
impl FromStr for CrateName { impl FromStr for CrateName {
type Err = Infallible; type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(if let Some((name, version)) = s.split_once('@') { Ok(if let Some((name, version)) = s.split_once('@') {
CrateName { CrateName {
name: name.into(), name: name.into(),
version: Some(version.into()), version_req: Some(parse_version(version)?),
} }
} else { } else {
CrateName { CrateName {
name: s.into(), name: s.into(),
version: None, version_req: None,
} }
}) })
} }
@ -60,11 +63,11 @@ mod tests {
([ $( ( $input_name:expr, $input_version:expr ) ),* ], [ $( ( $output_name:expr, $output_version:expr ) ),* ]) => { ([ $( ( $input_name:expr, $input_version:expr ) ),* ], [ $( ( $output_name:expr, $output_version:expr ) ),* ]) => {
let input_crate_names = vec![$( CrateName { let input_crate_names = vec![$( CrateName {
name: $input_name.into(), name: $input_name.into(),
version: Some($input_version.into()) version_req: Some($input_version.parse().unwrap())
}, )*]; }, )*];
let mut output_crate_names: Vec<CrateName> = vec![$( CrateName { let mut output_crate_names: Vec<CrateName> = vec![$( CrateName {
name: $output_name.into(), version: Some($output_version.into()) name: $output_name.into(), version_req: Some($output_version.parse().unwrap())
}, )*]; }, )*];
output_crate_names.sort_by(|x, y| x.name.cmp(&y.name)); output_crate_names.sort_by(|x, y| x.name.cmp(&y.name));