use crate::error::{DeckIdError, Result};
use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64};
use uuid::Uuid;
pub fn validate_deck_id(deck_id: &str) -> Result<()> {
let decoded = BASE64
.decode(deck_id)
.map_err(|e| DeckIdError::InvalidBase64(e.to_string()))?;
let decoded_str = String::from_utf8(decoded).map_err(|e| {
DeckIdError::InvalidFormat(format!("Invalid UTF-8 after base64 decode: {}", e))
})?;
if !decoded_str.starts_with("Deck:") {
return Err(DeckIdError::InvalidFormat("Missing 'Deck:' prefix".to_string()).into());
}
let uuid_str = decoded_str.trim_start_matches("Deck:");
let uuid = Uuid::parse_str(uuid_str).map_err(|e| DeckIdError::InvalidUuid(e.to_string()))?;
if uuid.get_version() != Some(uuid::Version::Random) {
return Err(DeckIdError::NotUuidV4(format!(
"Expected UUID v4, got version {:?}",
uuid.get_version()
))
.into());
}
Ok(())
}