use std::error::Error;
pub fn parse_principal(principal: &str) -> Result<(&str, &str), Box<dyn Error>> {
let parts: Vec<&str> = principal.split('@').collect();
if parts.len() != 2 {
return Err("Principal must be in format username@REALM".into());
}
Ok((parts[0], parts[1]))
}
pub fn get_username(principal: &str) -> Result<&str, Box<dyn Error>> {
parse_principal(principal).map(|(username, _)| username)
}
pub fn get_realm(principal: &str) -> Result<&str, Box<dyn Error>> {
parse_principal(principal).map(|(_, realm)| realm)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_principal() {
let principal = "hdfs@TEST.COM";
let (username, realm) = parse_principal(principal).unwrap();
assert_eq!(username, "hdfs");
assert_eq!(realm, "TEST.COM");
let principal2 = "admin/user@EXAMPLE.COM";
let (username2, realm2) = parse_principal(principal2).unwrap();
assert_eq!(username2, "admin/user");
assert_eq!(realm2, "EXAMPLE.COM");
}
#[test]
fn test_get_username() {
let principal = "hdfs@TEST.COM";
let username = get_username(principal).unwrap();
assert_eq!(username, "hdfs");
}
#[test]
fn test_get_realm() {
let principal = "hdfs@TEST.COM";
let realm = get_realm(principal).unwrap();
assert_eq!(realm, "TEST.COM");
}
}