///|
/// 严格校验条码数据是否合法(格式 + 校验位)。
///
/// 与 `encode` 不同,`validate` 要求输入是包含校验位的完整形式:
/// EAN-13 13 位、EAN-8 8 位、UPC-A 12 位、ITF-14 14 位。
pub fn validate(
symbology : Symbology,
data : String,
) -> Result[Unit, EncodeError] {
let d = strip_separators(data)
match symbology {
EAN13 =>
if d.length() != 13 {
Err(InvalidData("EAN-13 validation requires 13 digits"))
} else if !mod10_verify(d, 1, 3) {
Err(InvalidData("EAN-13 check digit mismatch"))
} else {
Ok(())
}
EAN8 =>
if d.length() != 8 {
Err(InvalidData("EAN-8 validation requires 8 digits"))
} else if !mod10_verify(d, 3, 1) {
Err(InvalidData("EAN-8 check digit mismatch"))
} else {
Ok(())
}
UPCA =>
if d.length() != 12 {
Err(InvalidData("UPC-A validation requires 12 digits"))
} else if !mod10_verify(d, 3, 1) {
Err(InvalidData("UPC-A check digit mismatch"))
} else {
Ok(())
}
ITF14 =>
if d.length() != 14 {
Err(InvalidData("ITF-14 validation requires 14 digits"))
} else if !mod10_verify(d, 3, 1) {
Err(InvalidData("ITF-14 check digit mismatch"))
} else {
Ok(())
}
Code39 => validate_code39(data)
Code93 => validate_code93(data)
Code128 => validate_code128(data)
}
}
///|
/// 便捷的布尔校验入口。
pub fn is_valid(symbology : Symbology, data : String) -> Bool {
match validate(symbology, data) {
Ok(_) => true
Err(_) => false
}
}