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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
use std::process::Command;
pub fn get_author() -> Result<String, Box<dyn std::error::Error>> {
let cargo_toml_path = std::path::Path::new("Cargo.toml");
let cargo_toml_content = std::fs::read_to_string(cargo_toml_path)?;
let cargo_toml: toml::Value = toml::from_str(&cargo_toml_content)?;
if let Some(package) = cargo_toml.get("package")
&& let Some(authors) = package.get("authors")
&& let Some(authors_array) = authors.as_array()
&& let Some(first_author) = authors_array.first()
&& let Some(author_str) = first_author.as_str() {
return Ok(author_str.to_string());
}
Err("Author not found in Cargo.toml".into())
}
pub fn get_site() -> Result<String, Box<dyn std::error::Error>> {
let cargo_toml_path = std::path::Path::new("Cargo.toml");
let cargo_toml_content = std::fs::read_to_string(cargo_toml_path)?;
let cargo_toml: toml::Value = toml::from_str(&cargo_toml_content)?;
if let Some(package) = cargo_toml.get("package")
&& let Some(homepage) = package.get("homepage")
&& let Some(site_str) = homepage.as_str() {
return Ok(site_str.to_string());
}
Err("Homepage not found in Cargo.toml".into())
}
pub fn get_platform(target: &str) -> String {
if target.contains("windows") {
"Windows".to_string()
} else if target.contains("linux") {
"Linux".to_string()
} else if target.contains("darwin") || target.contains("macos") {
"macOS".to_string()
} else if target.contains("android") {
"Android".to_string()
} else if target.contains("ios") {
"iOS".to_string()
} else {
"Unknown".to_string()
}
}
pub fn get_toolchain() -> String {
let rustc_version = std::process::Command::new("rustc")
.arg("--version")
.output()
.ok()
.and_then(|output| String::from_utf8(output.stdout).ok())
.unwrap_or_else(|| "unknown".to_string())
.trim()
.to_string();
let channel = if rustc_version.contains("nightly") {
"nightly"
} else if rustc_version.contains("beta") {
"beta"
} else {
"stable"
};
format!("{} ({})", rustc_version, channel)
}
pub fn get_version() -> String {
let cargo_toml_path = std::path::Path::new("Cargo.toml");
let cargo_toml_content = match std::fs::read_to_string(cargo_toml_path) {
Ok(content) => content,
Err(_) => return "unknown".to_string(),
};
let cargo_toml: toml::Value = match toml::from_str(&cargo_toml_content) {
Ok(value) => value,
Err(_) => return "unknown".to_string(),
};
if let Some(workspace) = cargo_toml.get("workspace")
&& let Some(package) = workspace.get("package")
&& let Some(version) = package.get("version")
&& let Some(version_str) = version.as_str() {
return version_str.to_string();
}
"unknown".to_string()
}
pub fn get_git_branch() -> Result<String, Box<dyn std::error::Error>> {
let output = Command::new("git")
.args(["branch", "--show-current"])
.output()?;
if output.status.success() {
let branch = String::from_utf8(output.stdout)?.trim().to_string();
if branch.is_empty() {
// Try to get HEAD reference if no branch (detached HEAD)
let output = Command::new("git")
.args(["rev-parse", "--abbrev-ref", "HEAD"])
.output()?;
if output.status.success() {
let head_ref = String::from_utf8(output.stdout)?.trim().to_string();
return Ok(head_ref);
}
} else {
return Ok(branch);
}
}
Err("Failed to get git branch".into())
}
pub fn get_git_commit() -> Result<String, Box<dyn std::error::Error>> {
let output = Command::new("git").args(["rev-parse", "HEAD"]).output()?;
if output.status.success() {
let commit = String::from_utf8(output.stdout)?.trim().to_string();
return Ok(commit);
}
Err("Failed to get git commit".into())
}
|