use crate::tr_with;
use isbn2::{Isbn, IsbnError};
use std::str::FromStr;
pub fn normalize_isbn(isbn_input: &str, is_plain: bool) -> Result<String, String> {
let cleaned = isbn_input.trim().replace([' ', '-'], "");
match Isbn::from_str(&cleaned) {
Ok(isbn) => {
let plain = isbn.to_string();
let formatted = isbn
.hyphenate()
.unwrap_or_else(|_| plain.clone().parse().unwrap());
Ok(if is_plain {
plain
} else {
formatted.parse().unwrap()
})
}
Err(IsbnError::InvalidChecksum) => Err(format!(
"\n{}",
&tr_with("book.isbn.invalid_checksum", &[("isbn", isbn_input)]),
)),
Err(IsbnError::InvalidLength) => Err(format!(
"\n{}",
&tr_with("book.isbn.invalid_length", &[("isbn", isbn_input)])
)),
Err(IsbnError::InvalidConversion) => Err(format!(
"\n{}",
&tr_with("book.isbn.invalid_conversion", &[("isbn", isbn_input)])
)),
Err(IsbnError::InvalidDigit) => Err(format!(
"\n{}",
&tr_with("book.isbn.invalid_digit", &[("isbn", isbn_input)])
)),
Err(IsbnError::DigitTooLarge) => Err(format!(
"\n{}",
&tr_with("book.isbn.digit_too_large", &[("isbn", isbn_input)])
)),
Err(IsbnError::InvalidGroup) => Err(format!(
"\n{}",
&tr_with("book.isbn.invalid_group", &[("isbn", isbn_input)])
)),
Err(IsbnError::UndefinedRange) => Err(format!(
"\n{}",
&tr_with("book.isbn.undefined_range", &[("isbn", isbn_input)])
)),
}
}