use ic_platform::candid::contract::Principal;
pub fn validate_canonical<E>(
value: &str,
invalid: impl FnOnce(String) -> E,
noncanonical: impl FnOnce(String) -> E,
) -> Result<(), E> {
parse_canonical(value, invalid, noncanonical).map(|_| ())
}
pub fn parse_canonical<E>(
value: &str,
invalid: impl FnOnce(String) -> E,
noncanonical: impl FnOnce(String) -> E,
) -> Result<Principal, E> {
let principal = Principal::from_text(value).map_err(|error| invalid(error.to_string()))?;
let canonical = principal.to_text();
if canonical == value {
Ok(principal)
} else {
Err(noncanonical(canonical))
}
}
#[cfg(test)]
mod tests;