blob: 56f4b172268d2d5e27fd509c31027b53a17cea95 [file] [log] [blame]
//! Advisory keywords
use crate::error::Error;
use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize};
use std::str::FromStr;
/// Keywords on advisories, similar to Cargo keywords
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize)]
pub struct Keyword(String);
impl Keyword {
/// Borrow this keyword as a string slice
pub fn as_str(&self) -> &str {
self.0.as_ref()
}
}
impl AsRef<str> for Keyword {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl<'de> Deserialize<'de> for Keyword {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Self::from_str(&String::deserialize(deserializer)?)
.map_err(|e| D::Error::custom(format!("{}", e)))
}
}
impl FromStr for Keyword {
type Err = Error;
/// Create a new keyword
fn from_str(keyword: &str) -> Result<Self, Error> {
// TODO: validate keywords according to Cargo-like rules
Ok(Keyword(keyword.into()))
}
}