use core::{fmt::Debug, str::FromStr};
pub(crate) fn check<T, F>(roster: &[T], what: &str, as_str: F)
where
T: FromStr + PartialEq + Debug,
<T as FromStr>::Err: Debug,
F: Fn(&T) -> &str,
{
assert!(!roster.is_empty(), "{what}: ROSTER is empty");
for (i, entry) in roster.iter().enumerate() {
let slug = as_str(entry);
for (j, prior) in roster.iter().enumerate().take(i) {
assert!(
prior != entry,
"{what}: ROSTER names entry {j} ({slug}) again at {i}"
);
assert!(
as_str(prior) != slug,
"{what}: ROSTER entries {j} and {i} both render `{slug}`, \
so `FromStr` cannot be the inverse of `as_str` for both"
);
}
let parsed = slug
.parse::<T>()
.unwrap_or_else(|e| panic!("{what}: ROSTER slug `{slug}` does not parse: {e:?}"));
assert!(
&parsed == entry,
"{what}: `{slug}` parses to {parsed:?}, not the roster entry {entry:?}"
);
}
}