use crate::limits::{MAX_COLUMN, MAX_ROW};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Address {
pub row: u32,
pub column: u32,
}
pub fn parse_a1(key: &str) -> Option<Address> {
let bytes = key.as_bytes();
let mut i = 0;
let mut column: u32 = 0;
while i < bytes.len() && bytes[i].is_ascii_uppercase() {
if i >= 3 {
return None; }
column = column * 26 + (bytes[i] - b'A' + 1) as u32;
i += 1;
}
if i == 0 {
return None; }
let digits = &bytes[i..];
if digits.is_empty() || digits.len() > 8 {
return None;
}
if digits[0] == b'0' {
return None; }
let mut row: u32 = 0;
for &b in digits {
if !b.is_ascii_digit() {
return None;
}
row = row.checked_mul(10)?.checked_add((b - b'0') as u32)?;
}
if row == 0 || row > MAX_ROW || column == 0 || column > MAX_COLUMN {
return None;
}
Some(Address { row, column })
}