Files
comparador-notas/src/domain/entities/serie.rs
T
Felipe e64988a139 feat: implement main application structure with UI and layout management
- Added main application logic in `src/ui/app.rs` to handle state and modal dialogs.
- Created module structure for UI components in `src/ui/mod.rs`.
- Implemented column configuration screen in `src/ui/screens/configuracao_colunas.rs`.
- Developed file import screen in `src/ui/screens/import.rs` for CSV and XLSX files.
- Added layout management screen in `src/ui/screens/layouts.rs` for saving and importing layouts.
- Created result display screen in `src/ui/screens/resultado.rs` to show analysis results.
- Introduced modular organization for screens in `src/ui/screens/mod.rs`.
2026-03-02 22:14:02 -03:00

59 lines
1.5 KiB
Rust

use crate::domain::errors::ErroSerie;
use regex::Regex;
use std::sync::OnceLock;
static REGEX_SERIE: OnceLock<Regex> = OnceLock::new();
fn regex_serie() -> &'static Regex {
REGEX_SERIE.get_or_init(|| Regex::new(r"^[0-9]{1,3}$").expect("Regex de série inválida"))
}
/// Valida e normaliza uma série.
/// Retorna `Ok(serie_normalizada)` ou `Err(ErroSerie)`.
pub fn validar_serie(s: &str) -> Result<String, ErroSerie> {
let trimmed = s.trim();
if trimmed.is_empty() {
return Err(ErroSerie::Vazia);
}
if regex_serie().is_match(trimmed) {
Ok(trimmed.to_string())
} else {
Err(ErroSerie::Invalida(trimmed.to_string()))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serie_valida_simples() {
assert!(validar_serie("1").is_ok());
assert!(validar_serie("01").is_ok());
assert!(validar_serie("001").is_ok());
assert!(validar_serie("999").is_ok());
}
#[test]
fn serie_com_espacos_e_valida() {
assert!(validar_serie(" 1 ").is_ok());
}
#[test]
fn serie_invalida_letras() {
assert!(validar_serie("ABC").is_err());
assert!(validar_serie("1A").is_err());
}
#[test]
fn serie_invalida_quatro_digitos() {
assert!(validar_serie("1234").is_err());
}
#[test]
fn serie_vazia() {
assert!(matches!(validar_serie(""), Err(ErroSerie::Vazia)));
assert!(matches!(validar_serie(" "), Err(ErroSerie::Vazia)));
}
}