use std::ffi::CString; use std::marker; use std::ptr; use crate::raw; use crate::util::Binding; /// Options which can be specified to various fetch operations. #[derive(Default)] pub struct ProxyOptions<'a> { url: Option, proxy_kind: raw::git_proxy_t, _marker: marker::PhantomData<&'a i32>, } impl<'a> ProxyOptions<'a> { /// Creates a new set of proxy options ready to be configured. pub fn new() -> ProxyOptions<'a> { Default::default() } /// Try to auto-detect the proxy from the git configuration. /// /// Note that this will override `url` specified before. pub fn auto(&mut self) -> &mut Self { self.proxy_kind = raw::GIT_PROXY_AUTO; self } /// Specify the exact URL of the proxy to use. /// /// Note that this will override `auto` specified before. pub fn url(&mut self, url: &str) -> &mut Self { self.proxy_kind = raw::GIT_PROXY_SPECIFIED; self.url = Some(CString::new(url).unwrap()); self } } impl<'a> Binding for ProxyOptions<'a> { type Raw = raw::git_proxy_options; unsafe fn from_raw(_raw: raw::git_proxy_options) -> ProxyOptions<'a> { panic!("can't create proxy from raw options") } fn raw(&self) -> raw::git_proxy_options { raw::git_proxy_options { version: raw::GIT_PROXY_OPTIONS_VERSION, kind: self.proxy_kind, url: self.url.as_ref().map(|s| s.as_ptr()).unwrap_or(ptr::null()), credentials: None, certificate_check: None, payload: ptr::null_mut(), } } }