blob: 9b618913d0e9a1c91836068b09b371387c0c36f8 [file] [log] [blame]
use crate::{
config,
config::tree::{keys, Fetch, Key, Section},
};
impl Fetch {
/// The `fetch.negotiationAlgorithm` key.
pub const NEGOTIATION_ALGORITHM: NegotiationAlgorithm = NegotiationAlgorithm::new_with_validate(
"negotiationAlgorithm",
&config::Tree::FETCH,
validate::NegotiationAlgorithm,
);
/// The `fetch.recurseSubmodules` key.
#[cfg(feature = "attributes")]
pub const RECURSE_SUBMODULES: RecurseSubmodules =
RecurseSubmodules::new_with_validate("recurseSubmodules", &config::Tree::FETCH, validate::RecurseSubmodules);
}
impl Section for Fetch {
fn name(&self) -> &str {
"fetch"
}
fn keys(&self) -> &[&dyn Key] {
&[
&Self::NEGOTIATION_ALGORITHM,
#[cfg(feature = "attributes")]
&Self::RECURSE_SUBMODULES,
]
}
}
/// The `fetch.negotiationAlgorithm` key.
pub type NegotiationAlgorithm = keys::Any<validate::NegotiationAlgorithm>;
/// The `fetch.recurseSubmodules` key.
#[cfg(feature = "attributes")]
pub type RecurseSubmodules = keys::Any<validate::RecurseSubmodules>;
mod algorithm {
#[cfg(feature = "credentials")]
impl crate::config::tree::sections::fetch::NegotiationAlgorithm {
/// Derive the negotiation algorithm identified by `name`, case-sensitively.
pub fn try_into_negotiation_algorithm(
&'static self,
name: std::borrow::Cow<'_, crate::bstr::BStr>,
) -> Result<crate::remote::fetch::negotiate::Algorithm, crate::config::key::GenericErrorWithValue> {
use crate::{bstr::ByteSlice, remote::fetch::negotiate::Algorithm};
Ok(match name.as_ref().as_bytes() {
b"noop" => Algorithm::Noop,
b"consecutive" | b"default" => Algorithm::Consecutive,
b"skipping" => Algorithm::Skipping,
_ => {
return Err(crate::config::key::GenericErrorWithValue::from_value(
self,
name.into_owned(),
))
}
})
}
}
#[cfg(feature = "attributes")]
impl crate::config::tree::sections::fetch::RecurseSubmodules {
/// Obtain the way submodules should be updated.
pub fn try_into_recurse_submodules(
&'static self,
value: Result<bool, gix_config::value::Error>,
) -> Result<gix_submodule::config::FetchRecurse, crate::config::key::GenericErrorWithValue> {
gix_submodule::config::FetchRecurse::new(value)
.map_err(|err| crate::config::key::GenericErrorWithValue::from_value(self, err))
}
}
}
mod validate {
use crate::{bstr::BStr, config::tree::keys};
pub struct NegotiationAlgorithm;
impl keys::Validate for NegotiationAlgorithm {
#[cfg_attr(not(feature = "credentials"), allow(unused_variables))]
fn validate(&self, value: &BStr) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
#[cfg(feature = "credentials")]
crate::config::tree::Fetch::NEGOTIATION_ALGORITHM.try_into_negotiation_algorithm(value.into())?;
Ok(())
}
}
pub struct RecurseSubmodules;
impl keys::Validate for RecurseSubmodules {
#[cfg_attr(not(feature = "attributes"), allow(unused_variables))]
fn validate(&self, value: &BStr) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
#[cfg(feature = "attributes")]
{
let boolean = gix_config::Boolean::try_from(value).map(|b| b.0);
crate::config::tree::Fetch::RECURSE_SUBMODULES.try_into_recurse_submodules(boolean)?;
}
Ok(())
}
}
}