blob: 08f7ec1bd41ce42cc7d6d442efc153b0004d0fed [file] [log] [blame]
use crate::{
config,
config::tree::{keys, Index, Key, Section},
};
impl Index {
/// The `index.threads` key.
pub const THREADS: IndexThreads =
IndexThreads::new_with_validate("threads", &config::Tree::INDEX, validate::IndexThreads);
}
/// The `index.threads` key.
pub type IndexThreads = keys::Any<validate::IndexThreads>;
mod index_threads {
use std::borrow::Cow;
use crate::{
bstr::BStr,
config,
config::{key::GenericErrorWithValue, tree::index::IndexThreads},
};
impl IndexThreads {
/// Parse `value` into the amount of threads to use, with `1` being single-threaded, or `0` indicating
/// to select the amount of threads, with any other number being the specific amount of threads to use.
pub fn try_into_index_threads(
&'static self,
value: Cow<'_, BStr>,
) -> Result<usize, config::key::GenericErrorWithValue> {
gix_config::Integer::try_from(value.as_ref())
.ok()
.and_then(|i| i.to_decimal().and_then(|i| i.try_into().ok()))
.or_else(|| {
gix_config::Boolean::try_from(value.as_ref())
.ok()
.map(|b| if b.0 { 0 } else { 1 })
})
.ok_or_else(|| GenericErrorWithValue::from_value(self, value.into_owned()))
}
}
}
impl Section for Index {
fn name(&self) -> &str {
"index"
}
fn keys(&self) -> &[&dyn Key] {
&[&Self::THREADS]
}
}
mod validate {
use crate::{bstr::BStr, config::tree::keys};
pub struct IndexThreads;
impl keys::Validate for IndexThreads {
fn validate(&self, value: &BStr) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
super::Index::THREADS.try_into_index_threads(value.into())?;
Ok(())
}
}
}