1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use std::option::Option;
use chrono::{TimeZone, Utc};
use miette::Result;
use crate::{
external::Vcs,
mit::{cmd::CONFIG_KEY_EXPIRES, Author, AuthorState},
};
pub fn get_commit_coauthor_configuration(config: &mut dyn Vcs) -> Result<AuthorState<Vec<Author>>> {
let config_value = config.get_i64(CONFIG_KEY_EXPIRES)?;
match config_value {
Some(config_value) => {
if Utc::now() < Utc.timestamp(config_value, 0) {
let author_config = get_vcs_authors(config)?;
Ok(AuthorState::Some(author_config))
} else {
Ok(AuthorState::Timeout(Utc.timestamp(config_value, 0)))
}
}
None => Ok(AuthorState::None),
}
}
fn get_vcs_authors(config: &dyn Vcs) -> Result<Vec<Author>> {
let co_author_names = get_vcs_coauthor_names(config)?;
let co_author_emails = get_vcs_coauthor_emails(config)?;
Ok(co_author_names
.iter()
.copied()
.zip(co_author_emails)
.filter_map(new_author)
.collect())
}
fn new_author(parameters: (Option<&str>, Option<&str>)) -> Option<Author> {
match parameters {
(Some(name), Some(email)) => Some(Author::new(name, email, None)),
_ => None,
}
}
fn get_vcs_coauthor_names(config: &dyn Vcs) -> Result<Vec<Option<&str>>> {
super::vcs::get_vcs_coauthors_config(config, "name")
}
fn get_vcs_coauthor_emails(config: &dyn Vcs) -> Result<Vec<Option<&str>>> {
super::vcs::get_vcs_coauthors_config(config, "email")
}