use std::fmt;
use crate::path::pattern::{PathPattern, PathPatternError};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct InputSpec(PathPattern);
impl InputSpec {
pub fn parse(s: &str) -> Result<Self, PathPatternError> {
PathPattern::parse(s).map(Self)
}
#[must_use]
pub fn pattern(&self) -> &PathPattern {
&self.0
}
#[must_use]
pub fn into_pattern(self) -> PathPattern {
self.0
}
}
impl fmt::Display for InputSpec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
#[cfg(test)]
mod tests {
use crate::path::InputSpec;
use crate::path::pattern::PathPattern;
#[test]
fn parses_literal_input() {
let s = InputSpec::parse("src/lib.rs").unwrap();
assert!(s.pattern().is_literal());
}
#[test]
fn parses_glob_input() {
let s = InputSpec::parse("src/**/*.rs").unwrap();
assert!(s.pattern().is_glob());
}
#[test]
fn rejects_invalid_input() {
assert!(InputSpec::parse("./foo").is_err());
}
#[test]
fn round_trip() {
let original = "src/**/*.rs";
let s = InputSpec::parse(original).unwrap();
assert_eq!(s.to_string(), original);
let reparsed = InputSpec::parse(&s.to_string()).unwrap();
assert_eq!(s, reparsed);
}
#[test]
fn into_pattern_round_trips_to_pattern() {
let s = InputSpec::parse("src/lib.rs").unwrap();
let p: PathPattern = s.into_pattern();
assert!(p.is_literal());
}
}