blob: f1fbbcbe0dbc7f41a97b7141c1d77fa9f8997485 [file] [log] [blame]
use crate::{
config,
config::tree::{keys, Key, Push, Section},
};
impl Push {
/// The `push.default` key
pub const DEFAULT: Default = Default::new_with_validate("default", &config::Tree::PUSH, validate::Default);
}
impl Section for Push {
fn name(&self) -> &str {
"push"
}
fn keys(&self) -> &[&dyn Key] {
&[&Self::DEFAULT]
}
}
/// The `remote.<name>.tagOpt` key type.
pub type Default = keys::Any<validate::Default>;
mod default {
use std::borrow::Cow;
use crate::{
bstr::{BStr, ByteSlice},
config,
config::tree::push::Default,
push,
};
impl Default {
/// Try to interpret `value` as `push.default`.
pub fn try_into_default(
&'static self,
value: Cow<'_, BStr>,
) -> Result<push::Default, config::key::GenericErrorWithValue> {
Ok(match value.as_ref().as_bytes() {
b"nothing" => push::Default::Nothing,
b"current" => push::Default::Current,
b"upstream" | b"tracking" => push::Default::Upstream,
b"simple" => push::Default::Simple,
b"matching" => push::Default::Matching,
_ => return Err(config::key::GenericErrorWithValue::from_value(self, value.into_owned())),
})
}
}
}
mod validate {
pub struct Default;
use std::{borrow::Cow, error::Error};
use crate::{bstr::BStr, config::tree::keys::Validate};
impl Validate for Default {
fn validate(&self, value: &BStr) -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
super::Push::DEFAULT.try_into_default(Cow::Borrowed(value))?;
Ok(())
}
}
}