rutilities/utilities/
is_rut_valid.rs

1use super::get_verification_digit;
2use wasm_bindgen::prelude::wasm_bindgen;
3
4/// Check if a given rut is valid
5/// ```rust
6/// use rutilities::{is_rut_valid};
7///
8/// fn main() {
9///   let valid_rut = "11.111.111-1";
10///   assert_eq!(is_rut_valid(&valid_rut), true);
11///
12///   let invalid_rut = "12.345.678-9";
13///   assert_eq!(is_rut_valid(&invalid_rut), false);
14/// }
15#[wasm_bindgen(js_name = isRutValid)]
16pub fn is_rut_valid(rut: &str) -> bool {
17  let mut unformatted_document_number = rut.replace(".", "").replace("-", "");
18  let given_verification_digit = match unformatted_document_number.pop() {
19    Some(vd) => vd,
20    None => return false,
21  };
22
23  let expected_verification_digit = match get_verification_digit(&unformatted_document_number) {
24    Ok(vd) => vd,
25    Err(_) => return false,
26  };
27
28  return given_verification_digit == expected_verification_digit;
29}
30
31#[cfg(test)]
32mod tests {
33  use super::*;
34
35  #[test]
36  fn it_returns_false_for_invalid_rut() {
37    assert_eq!(is_rut_valid("1234"), false);
38  }
39
40  #[test]
41  fn it_returns_false_for_empty_rut() {
42    assert_eq!(is_rut_valid(""), false);
43  }
44
45  #[test]
46  fn it_returns_false_for_dirty_rut() {
47    assert_eq!(is_rut_valid("muddy87566129"), false);
48  }
49
50  #[test]
51  fn it_returns_true_for_valid_rut() {
52    assert_eq!(is_rut_valid("8756612-9"), true);
53  }
54}