use crate::{ config, config::tree::{keys, Key, Section, Ssh}, }; impl Ssh { /// The `ssh.variant` key pub const VARIANT: Variant = Variant::new_with_validate("variant", &config::Tree::SSH, validate::Variant) .with_environment_override("GIT_SSH_VARIANT") .with_deviation("We error if a variant is chosen that we don't know, as opposed to defaulting to 'ssh'"); } /// The `ssh.variant` key. pub type Variant = keys::Any; #[cfg(feature = "blocking-network-client")] mod variant { use std::borrow::Cow; use crate::{bstr::BStr, config, config::tree::ssh::Variant}; impl Variant { pub fn try_into_variant( &'static self, value: Cow<'_, BStr>, ) -> Result, config::key::GenericErrorWithValue> { use gix_protocol::transport::client::ssh::ProgramKind; use crate::bstr::ByteSlice; Ok(Some(match value.as_ref().as_bytes() { b"auto" => return Ok(None), b"ssh" => ProgramKind::Ssh, b"plink" => ProgramKind::Plink, b"putty" => ProgramKind::Putty, b"tortoiseplink" => ProgramKind::TortoisePlink, b"simple" => ProgramKind::Simple, _ => return Err(config::key::GenericErrorWithValue::from_value(self, value.into_owned())), })) } } } impl Section for Ssh { fn name(&self) -> &str { "ssh" } fn keys(&self) -> &[&dyn Key] { &[&Self::VARIANT] } } mod validate { use crate::{bstr::BStr, config::tree::keys}; pub struct Variant; impl keys::Validate for Variant { fn validate(&self, _value: &BStr) -> Result<(), Box> { #[cfg(feature = "blocking-network-client")] super::Ssh::VARIANT.try_into_variant(_value.into())?; Ok(()) } } }