From 38c8bc8cf297640a27a39eb1501af871f04f234c Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Tue, 12 Jul 2022 16:47:44 +1000 Subject: [PATCH] Impl new type `helpes::CrateName` Signed-off-by: Jiahao XU --- src/helpers.rs | 3 +++ src/helpers/crate_name.rs | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/helpers/crate_name.rs diff --git a/src/helpers.rs b/src/helpers.rs index b7614e2f..254119b8 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -34,6 +34,9 @@ pub use path_ext::*; mod tls_version; pub use tls_version::TLSVersion; +mod crate_name; +pub use crate_name::CrateName; + /// Load binstall metadata from the crate `Cargo.toml` at the provided path pub fn load_manifest_path>( manifest_path: P, diff --git a/src/helpers/crate_name.rs b/src/helpers/crate_name.rs new file mode 100644 index 00000000..b7eb1077 --- /dev/null +++ b/src/helpers/crate_name.rs @@ -0,0 +1,39 @@ +use std::convert::Infallible; +use std::fmt; +use std::str::FromStr; + +#[derive(Debug)] +pub struct CrateName { + pub name: String, + pub version: Option, +} + +impl fmt::Display for CrateName { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name)?; + + if let Some(version) = &self.version { + write!(f, "@{version}")?; + } + + Ok(()) + } +} + +impl FromStr for CrateName { + type Err = Infallible; + + fn from_str(s: &str) -> Result { + Ok(if let Some((name, version)) = s.split_once('@') { + CrateName { + name: name.to_string(), + version: Some(version.to_string()), + } + } else { + CrateName { + name: s.to_string(), + version: None, + } + }) + } +}