use crate::constants::{PROJECT_NAME, PROJECT_VERSION, REPO_HTTP};
use const_str::verified_regex;
use std::sync::LazyLock;
pub fn user_agent() -> &'static str {
static VERSION_STRING: LazyLock<String> = LazyLock::new(|| {
let isahc_version = regex::Regex::new(verified_regex!(r"isahc/\d+\.\d+\.\d+"))
.expect("Verified")
.find(isahc::version())
.expect("Version string")
.as_str();
let debug = if cfg!(debug_assertions) { "-debug" } else { "" };
let user_agent = format!(
"{PROJECT_NAME}/{PROJECT_VERSION}{debug} (curl/{} {isahc_version}; +{REPO_HTTP})",
curl::Version::get().version() );
println!("User-Agent: {user_agent}");
user_agent
});
&VERSION_STRING
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{constants::Regex, network::user_agent};
use regex_static::lazy_regex;
const UA_REGEX: Regex = lazy_regex!(
r"^git-gemini-forge/\d+\.\d+\.\d+(\-debug)? \(curl/\d+\.\d+\.\d+(-DEV)? isahc/\d+\.\d+\.\d+; \+https://[\w\./\-]+\)$"
);
#[test]
fn test_user_agent_string_is_reasonable() {
let actual = user_agent();
assert!(UA_REGEX.is_match(actual), "Unexpected UA: {actual:?}");
assert!(actual.contains(REPO_HTTP));
}
}