diff options
Diffstat (limited to 'src/path/existence.rs')
-rw-r--r-- | src/path/existence.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/path/existence.rs b/src/path/existence.rs new file mode 100644 index 0000000..343a9c1 --- /dev/null +++ b/src/path/existence.rs @@ -0,0 +1,85 @@ +// Copyright (c) 2018 The predicates-rs Project Developers. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::fmt; +use std::path; + +use crate::reflection; +use crate::utils; +use crate::Predicate; + +/// Predicate that checks if a file is present +/// +/// This is created by the `predicate::path::exists` and `predicate::path::missing`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ExistencePredicate { + exists: bool, +} + +impl Predicate<path::Path> for ExistencePredicate { + fn eval(&self, path: &path::Path) -> bool { + path.exists() == self.exists + } + + fn find_case<'a>( + &'a self, + expected: bool, + variable: &path::Path, + ) -> Option<reflection::Case<'a>> { + utils::default_find_case(self, expected, variable).map(|case| { + case.add_product(reflection::Product::new( + "var", + variable.display().to_string(), + )) + }) + } +} + +impl reflection::PredicateReflection for ExistencePredicate {} + +impl fmt::Display for ExistencePredicate { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let palette = crate::Palette::new(f.alternate()); + write!( + f, + "{}({})", + palette.description(if self.exists { "exists" } else { "missing" }), + palette.var("var") + ) + } +} + +/// Creates a new `Predicate` that ensures the path exists. +/// +/// # Examples +/// +/// ``` +/// use std::path::Path; +/// use predicates::prelude::*; +/// +/// let predicate_fn = predicate::path::exists(); +/// assert_eq!(true, predicate_fn.eval(Path::new("Cargo.toml"))); +/// ``` +pub fn exists() -> ExistencePredicate { + ExistencePredicate { exists: true } +} + +/// Creates a new `Predicate` that ensures the path doesn't exist. +/// +/// # Examples +/// +/// ``` +/// use std::path::Path; +/// use predicates::prelude::*; +/// +/// let predicate_fn = predicate::path::missing(); +/// assert_eq!(true, predicate_fn.eval(Path::new("non-existent-file.foo"))); +/// ``` +pub fn missing() -> ExistencePredicate { + ExistencePredicate { exists: false } +} |