use crate::util::stable_alphabetic_hash;
use acorn_core::prelude::alloc::{format, String};
use convert_case::{Case, Casing};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumIter, EnumString};
#[derive(Clone, Copy, Debug, Deserialize, Display, EnumIter, EnumString, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
#[strum(ascii_case_insensitive, serialize_all = "lowercase")]
pub enum Provider {
Osti,
OpenAlex,
CiteAs,
Orcid,
Ror,
}
impl Provider {
pub fn discovered_identifier(self, source: &str) -> String {
let normalized = format!("{self}-{source}")
.chars()
.fold((String::new(), false), |(mut output, separator), character| {
match character.to_ascii_lowercase() {
| character if character.is_ascii_alphanumeric() => {
if separator && !output.is_empty() {
output.push('-');
}
output.push(character);
(output, false)
}
| _ => (output, true),
}
})
.0
.trim_matches('-')
.to_case(Case::Kebab);
match normalized.len() <= 100 {
| true => normalized,
| false => format!(
"{}-{}",
normalized.chars().take(83).collect::<String>().trim_matches('-'),
stable_alphabetic_hash(&normalized)
),
}
}
}