1use std::path::Path;
2
3pub trait Prompter: Send {
7 fn prompt_username_password(&mut self, url: &str, git_config: &git2::Config) -> Option<(String, String)>;
11
12 fn prompt_password(&mut self, username: &str, url: &str, git_config: &git2::Config) -> Option<String>;
16
17 fn prompt_ssh_key_passphrase(&mut self, private_key_path: &Path, git_config: &git2::Config) -> Option<String>;
21}
22
23pub(crate) fn wrap_prompter<P>(prompter: P) -> Box<dyn ClonePrompter>
25where
26 P: Prompter + Clone + 'static,
27{
28 Box::new(prompter)
29}
30
31pub(crate) trait ClonePrompter: Prompter {
33 fn dyn_clone(&self) -> Box<dyn ClonePrompter>;
35
36 fn as_prompter(&self) -> &dyn Prompter;
38
39 fn as_prompter_mut(&mut self) -> &mut dyn Prompter;
41}
42
43impl<P> ClonePrompter for P
45where
46 P: Prompter + Clone + 'static,
47{
48 fn dyn_clone(&self) -> Box<dyn ClonePrompter> {
49 Box::new(self.clone())
50 }
51
52 fn as_prompter(&self) -> &dyn Prompter {
53 self
54 }
55
56 fn as_prompter_mut(&mut self) -> &mut dyn Prompter {
57 self
58 }
59}
60
61impl Clone for Box<dyn ClonePrompter> {
62 fn clone(&self) -> Self {
63 self.dyn_clone()
64 }
65}