stratus/infra/
build_info.rs

1use serde_json::json;
2
3use crate::alias::JsonValue;
4
5// -----------------------------------------------------------------------------
6// Build constants
7// -----------------------------------------------------------------------------
8pub const BUILD_HOSTNAME: &str = env!("BUILD_HOSTNAME");
9pub const BUILD_OPENSSL_VERSION: &str = env!("BUILD_OPENSSL_VERSION");
10pub const BUILD_GLIBC_VERSION: &str = env!("BUILD_GLIBC_VERSION");
11pub const BUILD_TIMESTAMP: &str = env!("VERGEN_BUILD_TIMESTAMP");
12
13pub const CARGO_DEBUG: &str = env!("VERGEN_CARGO_DEBUG");
14pub const CARGO_FEATURES: &str = env!("VERGEN_CARGO_FEATURES");
15
16pub const GIT_COMMIT: &str = env!("VERGEN_GIT_SHA");
17pub const GIT_COMMIT_TIMESTAMP: &str = env!("VERGEN_GIT_COMMIT_TIMESTAMP");
18pub const GIT_COMMIT_MESSAGE: &str = env!("VERGEN_GIT_COMMIT_MESSAGE");
19pub const GIT_COMMIT_AUTHOR: &str = env!("VERGEN_GIT_COMMIT_AUTHOR_NAME");
20pub const GIT_BRANCH: &str = env!("VERGEN_GIT_BRANCH");
21pub const GIT_DESCRIBE: &str = env!("VERGEN_GIT_DESCRIBE");
22pub const GIT_REPO_URL: &str = env!("VERGEN_GIT_REPO_URL");
23
24pub const RUST_VERSION: &str = env!("VERGEN_RUSTC_SEMVER");
25pub const RUST_CHANNEL: &str = env!("VERGEN_RUSTC_CHANNEL");
26pub const RUST_TARGET: &str = env!("VERGEN_RUSTC_HOST_TRIPLE");
27
28pub const SYSTEM_VERSION: &str = env!("VERGEN_SYSINFO_OS_VERSION");
29pub const SYSTEM_USER: &str = env!("VERGEN_SYSINFO_USER");
30
31const VERSION_WITH_BRANCH: &str = const_format::formatcp!("{GIT_BRANCH}::{GIT_COMMIT}");
32const VERSION_WITH_DESCRIBE: &str = const_format::formatcp!("{GIT_DESCRIBE}::{GIT_COMMIT}");
33
34/// Returns the current service name.
35///
36/// The service name is used to identify the application in external services.
37pub fn service_name() -> String {
38    format!("stratus-{}", binary_name())
39}
40
41/// Returns the current service name with version.
42pub fn service_name_with_version() -> String {
43    format!("{}::{}", service_name(), version())
44}
45
46/// Returns the current binary basename.
47pub fn binary_name() -> String {
48    let binary = std::env::current_exe().unwrap();
49    let binary_basename = binary.file_name().unwrap().to_str().unwrap().to_lowercase();
50
51    if binary_basename.starts_with("test_") {
52        "tests".to_string()
53    } else {
54        binary_basename
55    }
56}
57
58/// Returns the version derived from the build information.
59pub fn version() -> &'static str {
60    if GIT_BRANCH == "HEAD" { VERSION_WITH_DESCRIBE } else { VERSION_WITH_BRANCH }
61}
62
63/// Returns build info as JSON.
64pub fn as_json() -> JsonValue {
65    json!(
66        {
67            "build": {
68                "service_name": service_name(),
69                "binary_name": binary_name(),
70                "version": version(),
71                "service_name_with_version": service_name_with_version(),
72                "timestamp": BUILD_TIMESTAMP,
73                "hostname": BUILD_HOSTNAME,
74                "openssl_version": BUILD_OPENSSL_VERSION,
75                "glibc_version": BUILD_GLIBC_VERSION,
76            },
77            "cargo": {
78                "debug": CARGO_DEBUG,
79                "features": CARGO_FEATURES,
80            },
81            "git": {
82                "commit": GIT_COMMIT,
83                "commit_timestamp": GIT_COMMIT_TIMESTAMP,
84                "commit_message": GIT_COMMIT_MESSAGE,
85                "commit_author": GIT_COMMIT_AUTHOR,
86                "branch": GIT_BRANCH,
87                "describe": GIT_DESCRIBE,
88                "repo_url": GIT_REPO_URL,
89            },
90            "rust": {
91                "version": RUST_VERSION,
92                "channel": RUST_CHANNEL,
93                "target": RUST_TARGET,
94            },
95            "system": {
96                "version": SYSTEM_VERSION,
97                "user": SYSTEM_USER,
98            }
99        }
100    )
101}