use std::collections::BTreeSet;
use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct CrateId {
pub name: String,
pub version: semver::Version,
}
impl fmt::Display for CrateId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}@{}", self.name, self.version)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FeatureSet(pub BTreeSet<String>);
impl FeatureSet {
#[must_use]
pub const fn new() -> Self {
Self(BTreeSet::new())
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
#[must_use]
pub fn short_hash(&self) -> String {
let mut hasher = blake3::Hasher::new();
for f in &self.0 {
hasher.update(f.as_bytes());
}
hex::encode(&hasher.finalize().as_bytes()[..4])
}
}
impl Default for FeatureSet {
fn default() -> Self {
Self::new()
}
}
impl FromIterator<String> for FeatureSet {
fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> Self {
Self(iter.into_iter().collect())
}
}