Je choisis d'utiliser un module avec tests :
// src/lib.rs
pub fn is_valid(s: &str) -> bool{
let mut colonne = 0;
let mut total = 0;
for car in s.chars() {
let digit:u32 = match car.to_digit(10) {
Some(nombre) => nombre,
None => continue,
};
if colonne%2 == 0 {
total += double_digit(digit);
} else {
total += digit;
}
colonne += 1;
}
if colonne != 16 {
return false
}
if total%10 == 0 {
true
} else {
false
}
}
fn double_digit(d:u32) -> u32 {
/* calcule 2d et retire 9 si 2d >= 10
*/
let dd = 2*d;
if dd > 9 {dd - 9} else {dd}
}
#[cfg(test)]
mod tests {
#[test]
fn double_digit_test_inf() {
assert_eq!(crate::double_digit(0), 0);
assert_eq!(crate::double_digit(1), 2);
assert_eq!(crate::double_digit(2), 4);
assert_eq!(crate::double_digit(3), 6);
assert_eq!(crate::double_digit(4), 8);
}
#[test]
fn double_digit_test_sup() {
assert_eq!(crate::double_digit(5), 1);
assert_eq!(crate::double_digit(6), 3);
assert_eq!(crate::double_digit(7), 5);
assert_eq!(crate::double_digit(8), 7);
assert_eq!(crate::double_digit(9), 9);
}
#[test]
fn test_valid() {
let code = "4556 7375 8689 9855";
assert!(crate::is_valid(&code));
}
#[test]
fn test_invalid() {
let code = "4024 0071 0902 2143";
assert!(! crate::is_valid(&code));
}
}
Et le principal
// src/main.rs
use std::env;
use cb::is_valid;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
println!("Entrez le code cb à tester dans la ligne de commande.");
println!("Par exemple {} 4556-7375-8689-9855", &args[0]);
return;
}
if is_valid(&args[1]) {
println!("{} est valide.", &args[1]);
} else {
println!("{} est invalide.", &args[1]);
}
}