| use std::ffi::OsString; | 
 |  | 
 | use crate::{Defaults, MagicSignature, SearchMode}; | 
 |  | 
 | /// | 
 | #[allow(clippy::empty_docs)] | 
 | pub mod from_environment { | 
 |     /// The error returned by [Defaults::from_environment()](super::Defaults::from_environment()). | 
 |     #[derive(Debug, thiserror::Error)] | 
 |     #[allow(missing_docs)] | 
 |     pub enum Error { | 
 |         #[error(transparent)] | 
 |         ParseValue(#[from] gix_config_value::Error), | 
 |         #[error("Glob and no-glob settings are mutually exclusive")] | 
 |         MixedGlobAndNoGlob, | 
 |     } | 
 | } | 
 |  | 
 | impl Defaults { | 
 |     /// Initialize this instance using information from the environment as | 
 |     /// [per the official documentation](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables) *(look for `PATHSPECS`)*, | 
 |     /// calling `var(variable_name)` for each variable that should be obtained. | 
 |     /// | 
 |     /// Used environment variables are `GIT_GLOB_PATHSPECS`, `GIT_NOGLOB_PATHSPECS`, `GIT_LITERAL_PATHSPECS` and `GIT_ICASE_PATHSPECS`. | 
 |     /// Note that there are lot of failure modes, and instead of offering lenient parsing, the caller may ignore errors and | 
 |     /// use other defaults instead. | 
 |     /// | 
 |     /// ### Deviation | 
 |     /// | 
 |     /// Instead of failing if `GIT_LITERAL_PATHSPECS` is used with glob globals, we ignore these. Also our implementation allows global | 
 |     /// `icase` settings in combination with this setting. | 
 |     pub fn from_environment(var: &mut dyn FnMut(&str) -> Option<OsString>) -> Result<Self, from_environment::Error> { | 
 |         let mut env_bool = |name: &str| -> Result<Option<bool>, gix_config_value::Error> { | 
 |             var(name) | 
 |                 .map(|val| gix_config_value::Boolean::try_from(val).map(|b| b.0)) | 
 |                 .transpose() | 
 |         }; | 
 |  | 
 |         let literal = env_bool("GIT_LITERAL_PATHSPECS")?.unwrap_or_default(); | 
 |         let signature = env_bool("GIT_ICASE_PATHSPECS")? | 
 |             .and_then(|val| val.then_some(MagicSignature::ICASE)) | 
 |             .unwrap_or_default(); | 
 |         if literal { | 
 |             return Ok(Defaults { | 
 |                 signature, | 
 |                 search_mode: SearchMode::Literal, | 
 |                 literal, | 
 |             }); | 
 |         } | 
 |         let glob = env_bool("GIT_GLOB_PATHSPECS")?; | 
 |         let mut search_mode = glob | 
 |             .and_then(|glob| glob.then_some(SearchMode::PathAwareGlob)) | 
 |             .unwrap_or_default(); | 
 |         search_mode = env_bool("GIT_NOGLOB_PATHSPECS")? | 
 |             .map(|no_glob| { | 
 |                 if glob.unwrap_or_default() && no_glob { | 
 |                     Err(from_environment::Error::MixedGlobAndNoGlob) | 
 |                 } else { | 
 |                     Ok(SearchMode::Literal) | 
 |                 } | 
 |             }) | 
 |             .transpose()? | 
 |             .unwrap_or(search_mode); | 
 |  | 
 |         Ok(Defaults { | 
 |             signature, | 
 |             search_mode, | 
 |             literal, | 
 |         }) | 
 |     } | 
 | } |