// // Copyright (c) 2020-2022 science+computing ag and other contributors // // This program and the accompanying materials are made // available under the terms of the Eclipse Public License 2.0 // which is available at https://www.eclipse.org/legal/epl-2.0/ // // SPDX-License-Identifier: EPL-2.0 // use std::ops::Deref; use pom::parser::Parser as PomParser; use serde::Deserialize; use serde::Serialize; #[derive( parse_display::Display, Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd, )] #[serde(transparent)] #[display("{0}")] pub struct PackageName(String); impl Deref for PackageName { type Target = String; fn deref(&self) -> &Self::Target { &self.0 } } impl AsRef for PackageName { fn as_ref(&self) -> &str { &self.0 } } impl From for PackageName { fn from(s: String) -> Self { PackageName(s) } } impl PackageName { pub fn parser<'a>() -> PomParser<'a, u8, Self> { use crate::util::parser::*; (letters() + ((letters() | numbers()).repeat(0..))) .collect() .convert(|b| String::from_utf8(b.to_vec()).map(Self::from)) } }