use super::*;
pub(crate) fn runtime_profile_route_key_parts<'a>(
key: &'a str,
prefix: &str,
) -> Option<(&'a str, &'a str)> {
let rest = key.strip_prefix(prefix)?;
let (route, profile_name) = rest.split_once(':')?;
Some((route, profile_name))
}
pub(crate) fn runtime_profile_transport_backoff_key(
profile_name: &str,
route_kind: RuntimeRouteKind,
) -> String {
format!(
"__route_transport_backoff__:{}:{profile_name}",
runtime_route_kind_label(route_kind)
)
}
pub(crate) fn runtime_profile_transport_backoff_key_parts(key: &str) -> Option<(&str, &str)> {
runtime_profile_route_key_parts(key, "__route_transport_backoff__:")
}
pub(crate) fn runtime_profile_transport_backoff_profile_name(key: &str) -> &str {
runtime_profile_transport_backoff_key_parts(key)
.map(|(_, profile_name)| profile_name)
.unwrap_or(key)
}
pub(crate) fn runtime_profile_transport_backoff_key_valid(
key: &str,
valid_profiles: &BTreeSet<String>,
) -> bool {
runtime_profile_transport_backoff_key_parts(key)
.map(|(route, profile_name)| {
runtime_route_kind_from_label(route).is_some() && valid_profiles.contains(profile_name)
})
.unwrap_or_else(|| valid_profiles.contains(key))
}
pub(crate) fn runtime_profile_transport_backoff_key_matches_profiles(
key: &str,
profiles: &BTreeMap<String, ProfileEntry>,
) -> bool {
runtime_profile_transport_backoff_key_parts(key)
.map(|(route, profile_name)| {
runtime_route_kind_from_label(route).is_some() && profiles.contains_key(profile_name)
})
.unwrap_or_else(|| profiles.contains_key(key))
}
pub(crate) fn runtime_profile_transport_backoff_until_from_map(
transport_backoff_until: &BTreeMap<String, i64>,
profile_name: &str,
route_kind: RuntimeRouteKind,
now: i64,
) -> Option<i64> {
let route_key = runtime_profile_transport_backoff_key(profile_name, route_kind);
[
transport_backoff_until.get(&route_key).copied(),
transport_backoff_until.get(profile_name).copied(),
]
.into_iter()
.flatten()
.filter(|until| *until > now)
.max()
}
pub(crate) fn runtime_profile_transport_backoff_max_until(
transport_backoff_until: &BTreeMap<String, i64>,
profile_name: &str,
now: i64,
) -> Option<i64> {
transport_backoff_until
.iter()
.filter(|(key, until)| {
runtime_profile_transport_backoff_profile_name(key) == profile_name && **until > now
})
.map(|(_, until)| *until)
.max()
}