create_roblox_project/
discover_author.rs

1use std::env;
2use git2::{Config, Repository};
3
4fn get_environment_variable(variables: &[&str]) -> Option<String> {
5    variables.iter().filter_map(|var| env::var(var).ok()).next()
6}
7
8pub fn discover_author() -> Option<(String, Option<String>)> {
9    let cwd = env::current_dir().ok()?;
10    let git_config = if let Ok(repo) = Repository::discover(&cwd) {
11        repo.config()
12            .ok()
13            .or_else(|| Config::open_default().ok())
14    } else {
15        Config::open_default().ok()
16    };
17    let git_config = git_config.as_ref();
18    let name_variables = [
19        "GIT_AUTHOR_NAME",
20        "GIT_COMMITTER_NAME",
21        "USER",
22        "USERNAME",
23        "NAME",
24    ];
25    let name = get_environment_variable(&name_variables[0..2])
26        .or_else(|| git_config.and_then(|g| g.get_string("user.name").ok()))
27        .or_else(|| get_environment_variable(&name_variables[2..]))?;
28
29    let email_variables = [
30        "GIT_AUTHOR_EMAIL",
31        "GIT_COMMITTER_EMAIL",
32        "EMAIL",
33    ];
34    let email = get_environment_variable(&email_variables[0..3])
35        .or_else(|| git_config.and_then(|g| g.get_string("user.email").ok()))
36        .or_else(|| get_environment_variable(&email_variables[3..]));
37
38    let name = name.trim().to_string();
39    let email = email.map(|s| s.trim().to_string());
40
41    Some((name, email))
42}