use std::time::Instant;
use crate::check::{CheckOutcome, MatchKind, UncertainReason};
use crate::confidence::ConfidenceScore;
pub(super) fn default_user_agent() -> String {
format!("adler/{}", env!("CARGO_PKG_VERSION"))
}
pub(super) fn host_of(url: &str) -> String {
reqwest::Url::parse(url)
.ok()
.and_then(|u| u.host_str().map(str::to_owned))
.unwrap_or_else(|| "unknown".into())
}
pub(super) fn origin_and_path(url: &str) -> Option<(String, String)> {
let parsed = reqwest::Url::parse(url).ok()?;
let host = parsed.host_str()?;
let port = parsed.port().map_or_else(String::new, |p| format!(":{p}"));
let origin = format!("{}://{host}{port}", parsed.scheme());
let path = parsed.query().map_or_else(
|| parsed.path().to_owned(),
|q| format!("{}?{q}", parsed.path()),
);
Some((origin, path))
}
pub(super) fn outcome(site: &str, url: String, started: Instant, kind: MatchKind) -> CheckOutcome {
CheckOutcome {
site: site.to_owned(),
url,
kind,
reason: None,
elapsed_ms: elapsed_ms(started),
enrichment: std::collections::BTreeMap::new(),
evidence: Vec::new(),
profile_evidence: Vec::new(),
confidence: ConfidenceScore::from_parts(kind, None, 0, 0),
transport: None,
escalations: 0,
}
}
pub(super) fn uncertain(
site: &str,
url: String,
started: Instant,
reason: UncertainReason,
) -> CheckOutcome {
let confidence = ConfidenceScore::from_parts(MatchKind::Uncertain, Some(&reason), 0, 0);
CheckOutcome {
site: site.to_owned(),
url,
kind: MatchKind::Uncertain,
reason: Some(reason),
elapsed_ms: elapsed_ms(started),
enrichment: std::collections::BTreeMap::new(),
evidence: Vec::new(),
profile_evidence: Vec::new(),
confidence,
transport: None,
escalations: 0,
}
}
pub(super) fn elapsed_ms(started: Instant) -> u64 {
u64::try_from(started.elapsed().as_millis()).unwrap_or(u64::MAX)
}