use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CurlVersionInfo {
pub host: String,
pub libraries: Vec<String>,
pub features: Vec<String>,
}
pub fn libcurl_version_info() -> CurlVersionInfo {
let version = curl::Version::get();
let host = version.host().to_string();
let mut libraries = vec![format!("libcurl/{}", version.version())];
if let Some(s) = version.ssl_version() {
libraries.push(s.to_string());
}
if let Some(s) = version.libz_version() {
libraries.push(format!("zlib/{s}"));
}
if let Some(s) = version.brotli_version() {
libraries.push(format!("brotli/{s}"));
}
if let Some(s) = version.zstd_version() {
libraries.push(format!("zstd/{s}"));
}
if let Some(s) = version.ares_version() {
libraries.push(format!("c-ares/{s}"));
}
if let Some(s) = version.libidn_version() {
libraries.push(format!("libidn2/{s}"));
}
if let Some(s) = version.iconv_version_num()
&& s != 0
{
libraries.push(format!("iconv/{s}"));
}
if let Some(s) = version.libssh_version() {
libraries.push(s.to_string());
}
if let Some(s) = version.nghttp2_version() {
libraries.push(format!("nghttp2/{s}"));
}
if let Some(s) = version.quic_version() {
libraries.push(format!("quic/{s}"));
}
if let Some(s) = version.hyper_version() {
libraries.push(format!("hyper/{s}"));
}
if let Some(s) = version.gsasl_version() {
libraries.push(format!("libgsal/{s}"));
}
let all_features = HashMap::from([
("AsynchDNS", version.feature_async_dns()),
("Debug", version.feature_debug()),
("IDN", version.feature_idn()),
("IPv6", version.feature_ipv6()),
("Largefile", version.feature_largefile()),
("Unicode", version.feature_unicode()),
("SSPI", version.feature_sspi()),
("SPNEGO", version.feature_spnego()),
("NTLM", version.feature_ntlm()),
("NTLM_WB", version.feature_ntlm_wb()),
("SSL", version.feature_ssl()),
("libz", version.feature_libz()),
("brotli", version.feature_brotli()),
("zstd", version.feature_zstd()),
("CharConv", version.feature_conv()),
("TLS-SRP", version.feature_tlsauth_srp()),
("HTTP2", version.feature_http2()),
("HTTP3", version.feature_http3()),
("UnixSockets", version.feature_unix_domain_socket()),
("alt-svc", version.feature_altsvc()),
("HSTS", version.feature_hsts()),
("gsasl", version.feature_gsasl()),
("GSS-Negotiate", version.feature_gss_negotiate()),
]);
let mut features: Vec<String> = vec![];
for (k, v) in all_features.iter() {
if *v {
features.push(k.to_string());
}
}
features.sort_by_key(|k| k.to_lowercase());
CurlVersionInfo {
host,
libraries,
features,
}
}