The elves stared at their screens. They had just written the Kid
struct and were testing it with Santa’s data.
But something was wrong with the data, Prancer leaned back, smirking. "We forgot something obvious, didn’t we? The data’s raw strings—we need to parse it first."
Alice,10,2
Bob,5,5
Charlie,1,9
"We need to create another function," Prancer continued. "to parse the CSV rows into Kid
structs."
Blitzen slammed his mug down. "And since Santa put me in charge of this project, I’m naming the function. It’s going to be called parse_row
."
An elf from the back muttered just loud enough to hear, "Ugh, he thinks he’s better than us because Santa made him lead."
Blitzen shot them a look. "I heard that. If you’ve got a better name, I’m listening."
Silence.
"Exactly. parse_row
it is."
Blitzen paced. "We need a function that takes a CSV row, splits it, and converts it into a Kid
. Name is easy—it stays a String
. The good and bad deeds, though, need to be parsed to u32
."
"But what if the row has garbage data?" asked an elf, holding up a note with Charlie,,9
scribbled on it.
Prancer rolled his eyes. "Obviously, we handle errors. No .unwrap()
shortcuts."
Blitzen wants you to create an associated function for the Kid
struct and name it parse_row
. It should take a CSV row as a &str
and return a Result<Kid, &'static str>
. The function should:
String
.u32
for good and bad deeds.Kid
struct using the new()
associated function we created earlier.If you're stuck, here are some hints to help guide you:
Split the Row
Use split(',')
to divide the CSV row into parts. let fields = row.split(',');
Get Next Field
Get the next field with next()
, it's going to return an Option<&str>
.
Must be mutable
The next()
method requires a mutable reference to the iterator. So make it mutable, let mut fields = row.split(',');
.
Transform Option to Result
Use ok_or(&str)
to convert the Option
to a Result
. e.g., fields.next().ok_or("Missing field")
.
Propagate Errors (optional)
Use ?
to propagate errors. e.g., fields.next().ok_or("Missing field")?
.
Create a String
After you get access to the &str
use the to_string()
method to make it a String
and have Ownership.
Parse Numbers
Parse the second and third fields as u32
for good and bad deeds. Use .parse()
, you can either turbofish parse::<u32>()
or assign a type to the variable let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse();
.
Map the Error
The error from the parse()
method can't be propagated directly, you need to map it to the return types error type &'static str
using map_err()
. e.g., fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?
.
Create the Kid
Pass the extracted values to Kid::new
to build the Kid
struct.
Return a Result
Use Ok
for success and meaningful error messages (like "Invalid good deeds"
) for failures.
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let parts:Vec<&str> = csv_row.split(",").collect(); if parts.len() != 3 { return Err("Unexpected number of parts."); } let name = parts[0].to_string(); let good_deeds = parts[1].parse::<u32>().map_err(|_| "Invalid good deeds.")?; let bad_deeds = parts[2].parse::<u32>().map_err(|_| "Invalid good deeds.")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(","); let name = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid name")?; let good_deeds = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid name")?; let bad_deeds = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid name")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 let row: Vec<&str> = csv_row.split(',').collect(); if row.len() != 3 { return Err("Not correct number of fields"); } match (row[0].to_string(), row[1].parse::<u32>(), row[2].parse::<u32>()) { (name, Ok(good_deeds), Ok(bad_deeds)) => { return Ok(Self::new(name, good_deeds, bad_deeds)); }, (_name, Err(_), _) => { return Err("Error parsing line"); }, (_name, _, Err(_)) => { return Err("Error parsing line"); }, } // 🎁 Your code here! 🎁 } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let args : Vec<&str> = csv_row.split(',').collect(); let name : String = args[0].to_string(); match args.len() { 3 => match (args[1].parse::<u32>() , args[2].parse::<u32>()) { (Ok(good_deeds),Ok(bad_deeds)) => Ok(Self::new(name, good_deeds, bad_deeds)), (_,_) => Err("FOO"), }, _ => Err("FOO"), } } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut items = csv_row.split(","); let name = items.next().ok_or("Missing field")?.to_string(); let good: u32 = items.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad: u32 = items.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good, bad)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut cols = csv_row.split(','); let name: String = cols.next().unwrap().to_string(); let good_deeds: u32 = cols.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = cols.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 let split: Vec<_> = csv_row.split(",").collect(); if split.len() != 3 { Err("Invalid number of columns") } else { let name = split[0].trim().to_owned(); let good_deeds = match split[1].parse::<u32>() { Ok(v) => v, Err(_) => return Err("Error parsing good deeds"), }; let bad_deeds = match split[2].parse::<u32>() { Ok(v) => v, Err(_) => return Err("Error parsing good deeds"), }; Ok(Self::new(name, good_deeds, bad_deeds)) } } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let list = csv_row.split(",").collect::<Vec<&str>>(); if let (Some(name_str), Some(good_deeds_str), Some(bad_deeds_str)) = (list.get(0), list.get(1), list.get(2)) { let name = name_str.to_string(); if let (Ok(good_deeds), Ok(bad_deeds)) = (good_deeds_str.parse::<u32>(), bad_deeds_str.parse::<u32>()) { Ok(Self::new(name, good_deeds, bad_deeds)) } else { Err("Error") } } else { Err("Error") } } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let data:Vec<&str> = csv_row.split(",").collect(); if data.len() != 3{ return Err("The nomber of row is not 3"); } for inside in data.iter(){ if inside.len() == 0{ return Err("A data is empty"); } } let name = String::from(data[0]); let good_deeds:u32 = match data[1].trim().parse(){ Ok(i) => i, Err(_) => return Err("Good deeds cannot be parsed as a string") }; let bad_deeds = match data[2].trim().parse(){ Ok(i) => i, Err(_) => return Err("Bad deeds cannot be parsed as a string") }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { let values: Vec<&str> = csv_row.split(',').collect(); if values.len() != 3 { return Err("Invalid number of fields"); } let name = values[0].to_string(); let val_1 = values[1]; let val_2 = values[2]; let good_deeds = val_1.parse::<u32>().map_err(|_| "First value is not a valid u32")?; let bad_deeds = val_2.parse::<u32>().map_err(|_| "Second value is not a valid u32")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let fields: Vec<_> = csv_row.split(",").collect(); if fields.len() != 3 { return Err("hehe"); } let name = String::from(fields[0]); let good_deeds = match fields[1].parse() { Ok(num) => num, _ => Err("hmm")?, }; let bad_deeds = fields[2].parse().ok().ok_or("bad csv")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut iter = csv_row.split(','); let name = iter.next().ok_or("No name")?; let good_deeds = iter.next().ok_or("No good deeds")?; let bad_deeds = iter.next().ok_or("No bad deeds")?; let good_deeds = good_deeds.parse::<u32>().map_err(|_| "Bad good")?; let bad_deeds = bad_deeds.parse::<u32>().map_err(|_| "Bad bad")?; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
fn main() { println!("Hello, world!");}pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut éléments = csv_row.split(','); let name = éléments.next().ok_or("Missing name")?.to_string(); let good_deeds = éléments .next() .ok_or("Missing good deeds")? .parse::<u32>() .map_err(|_| "good_deeds Invalid")?; let bad_deeds = éléments .next() .ok_or("Missing bad_deeds")? .parse::<u32>() .map_err(|_| "bad_deeds Invalid")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}// #[cfg(test)]// mod tests {// use super::*;// #[test]// fn test_csv_parse() {// let csv_row = "Alice,3";// let kid = Kid::parse_row(csv_row).unwrap();// }// }
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut arr = csv_row.split(','); let name = arr.next().ok_or("Missing name")?.to_string(); let good_deeds = arr.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds = arr.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?; let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good needs")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad needs")?; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut it = csv_row.split(',').into_iter(); let name = match it.next() { Some(value) => value.to_string(), None => return Err("missing name"), }; let good_deeds = match it.next() { Some(value) => match value.parse::<u32>() { Ok(value) => value, Err(_) => return Err("Invalid value for good deeds"), }, None => return Err("missing good deeds"), }; let bad_deeds = match it.next() { Some(value) => match value.parse::<u32>() { Ok(value) => value, Err(_) => return Err("Invalid value for bad deeds"), }, None => return Err("missing deeds"), }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next() .ok_or("Missing field")? .to_string(); let good_deeds: u32 = fields.next() .ok_or("Missing field")? .parse() .map_err(|_| "Not a number")?; let bad_deeds: u32 = fields.next() .ok_or("Missing field")? .parse() .map_err(|_| "Not a number")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { let good_deeds = good_deeds as f32; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = match fields.next().ok_or("Missing field")?.parse() { Ok(number) => number, Err(_) => return Err("Not a number"), }; let bad_deeds: u32 = match fields.next().ok_or("Missing field")?.parse() { Ok(number) => number, Err(_) => return Err("Nor a number"), }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut token = csv_row.split(","); let name = token.next().ok_or("missing name")?; let tmp = token.next().ok_or("missing token 2")?; let good_deeds = match tmp.parse::<u32>() { Ok(good_deeds) => good_deeds, Err(_) => return Err("bad good_deeds"), }; let tmp = token.next().ok_or("missing token 3")?; let bad_deeds = match tmp.parse::<u32>() { Ok(bad_deeds) => bad_deeds, Err(_) => return Err("bad bad_deeds"), }; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 let datas: Vec<&str> = csv_row.split(",").collect(); if datas.len()< 3 { return Err("Sorry not enough data in the csv row"); }; let name = datas[0].to_string(); let good_deeds = datas[1].parse(); let good_deeds = match good_deeds{ Ok(good_deeds) => good_deeds, Err(_) => return Err("The second item could not be converted into a number") }; let bad_deeds = datas[2].parse(); let bad_deeds = match bad_deeds{ Ok(bad_deeds) => bad_deeds, Err(_) => return Err("The third item could not be converted into a number") }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let datas: Vec<&str> = csv_row.split(",").filter(|s| !s.is_empty()).collect(); if datas.len()< 3 { return Err("Sorry not enough data in the csv row"); }; let name = datas[0].to_string(); let good_deeds = datas[1].parse(); let good_deeds = match good_deeds{ Ok(good_deeds) => good_deeds, Err(_) => return Err("The second item could not be converted into a number") }; let bad_deeds = datas[2].parse(); let bad_deeds = match bad_deeds{ Ok(bad_deeds) => bad_deeds, Err(_) => return Err("The third item could not be converted into a number") }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let kid: Vec<&str> = csv_row.split(",").collect(); if kid.len() != 3 { return Err("error") } let good = kid[1].parse(); let good = match good { Ok(good) => good, Err(_) => return Err("Error") }; let bad = kid[2].parse(); let bad = match bad { Ok(bad) => bad, Err(_) => return Err("Error") }; Ok(Self::new( kid[0].into(), good, bad, )) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let kid: Vec<&str> = csv_row.split(",").collect(); if kid.len() != 3 { return Err("error") } let good = kid[1].parse(); let good = match good { Ok(good) => good, Err(e) => return Err("Error") }; let bad = kid[2].parse(); let bad = match bad { Ok(bad) => bad, Err(e) => return Err("Error") }; Ok(Self::new( kid[0].into(), good, bad, )) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let kid: Vec<&str> = csv_row.split(",").collect(); if kid.len() != 3 { return Err("error") } let good = kid[1].parse(); let good = match good { Ok(good) => good, Err(e) => return Err("Error") }; let bad = kid[2].parse(); let bad = match bad { Ok(bad) => bad, Err(e) => return Err("Error") }; Ok(Self::new( kid[0].into(), good, bad, )) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut splitted_row = csv_row.split(","); let name = splitted_row .next() .ok_or("Missing field")?.to_string(); let good_deeds = splitted_row .next() .ok_or("Missing field")? .parse::<u32>() .map_err(|_| "Invalid good deeds")?; let bad_deeds = splitted_row .next() .ok_or("Missing field")? .parse::<u32>() .map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let data: Vec<&str> = csv_row.clone().split(",").collect(); if data.iter().filter(|s| s.len() > 0).collect::<Vec::<&&str>>().len() != 3 { return Err("Missing field"); } let name: String; let good_deeds: u32; let bad_deeds: u32; if data[0].len() > 0 { name = data[0].to_string(); } else { return Err("Missing field"); } match data[1].parse::<u32>() { Ok(t) => good_deeds = t, Err(_) => return Err("Missing field"), } match data[2].parse::<u32>() { Ok(t) => bad_deeds = t, Err(_) => return Err("Missing field"), } Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 let mut parts = csv_row.split(','); let name = parts.next().ok_or("Missing field")?.to_string(); let good_deeds = parts.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds = parts.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name: String = fields.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing fields")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing fields")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let parts: Vec<&str> = csv_row.split(',').collect(); if parts.len() != 3 { return Err("size error") } let good_deeds = parts[1].parse::<u32>().map_err(|_| "wrong good deeds number")?; let bad_deeds = parts[2].parse::<u32>().map_err(|_| "wrong bad deeds number")?; Ok(Self::new(parts[0].to_string(), good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds = fields.next().ok_or("Missing field")?.to_string().parse::<u32>().map_err(|_|"Invalid good deeds")?; let bad_deeds = fields.next().ok_or("Missing field")?.to_string().parse::<u32>().map_err(|_|"Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(","); let name = fields.next().ok_or("Missing field")?.to_string(); let good_d = fields.next().ok_or("Missing field")?.parse::<u32>(); let bad_d = fields.next().ok_or("Missing field")?.parse::<u32>(); if good_d.is_ok() && bad_d.is_ok() { Ok(Kid::new(name, good_d.unwrap(), bad_d.unwrap())) } else { Err("Bad number") } } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut row = csv_row.split(','); let name = row.next().ok_or("Missing field")?.to_string(); let good_deeds = row.next().ok_or("Missing field")?.to_string().parse::<u32>().map_err(|_|"Invalid bad deeds")?; let bad_deeds = row.next().ok_or("Missing field")?.to_string().parse::<u32>().map_err(|_|"Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing field")?.to_string(); let good_deeds : u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds : u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(","); let name = fields.next().ok_or("Missing field")?; let name = name.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse().map_err(|_| "Invalid good deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let data: Vec<&str> = csv_row.split(',').collect(); if data.len() != 3 { return Err("CSV row does not have exactly three parts"); } let name = data[0].to_string(); let good_deeds = data[1] .parse::<u32>() .map_err(|_| "Failed to parse good deeds")?; let bad_deeds = data[2] .parse::<u32>() .map_err(|_| "Failed to parse bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next() .ok_or("Missing name field")? .to_string(); let good_deeds = fields.next() .ok_or("Missing first number")? .parse::<u32>() .map_err(|_| "Invalid number format")?; let bad_deeds = fields.next() .ok_or("Missing second number")? .parse::<u32>() .map_err(|_| "Invalid number format")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name: String = fields.next().ok_or("Missing name")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut columns = csv_row.split(','); let name: String = columns.next().ok_or("Missing name")?.to_string(); let good_deeds: u32 = columns.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = columns.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut columns = csv_row.split(','); let name: String = columns.next().ok_or("Missing name")?.to_string(); let good_deeds: u32 = columns.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = columns.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing Name")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds:u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing name")?.to_string(); let good_deeds: u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next().ok_or("Missing field")?.parse::<u32>().map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { let mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing name")?.to_string(); let good_deeds: u32 = fields .next() .ok_or("Missing good deeds")? .parse() .map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields .next() .ok_or("Missing bad deeds")? .parse() .map_err(|_| "Invalid bad deeds")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let parts: Vec<&str> = csv_row.split(',').collect(); if parts.len() != 3 { return Err("Error!!"); } let name = parts[0].to_string(); let good_deeds = parts[1] .parse::<u32>() .map_err(|_| "Invalid number for GoodDeeds")?; let bad_deeds = parts[2] .parse::<u32>() .map_err(|_| "Invalid number for BadDeeds")?; // Ensure we have exactly 3 parts (Name, GoodDeeds, BadDeeds) // Extract the name as a String Ok(Kid::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Kid { // Determine niceness based on good and bad deeds let niceness = if Kid::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) // Nice variant holds good_deeds value } else { Niceness::Naughty // Naughty variant has no associated value }; Kid { name, niceness, } } //pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Kid { // let niceness = if Self::is_nice(good_deeds, bad_deeds) { // Niceness::Nice(good_deeds) // } else { // Niceness::Naughty // }; // Kid { name, niceness } // } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 let mut row_splitted = csv_row.split(','); let name = row_splitted.next().ok_or("invalid csv")?.to_string(); let good_deeds : u32 = row_splitted.next().ok_or("invalid csv")?.parse().map_err(|_| "invalid type good")?; let bad_deeds : u32 = row_splitted.next().ok_or("invalid csv")?.parse().map_err(|_| "invalid type good")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}pub struct Kid { pub name: String, pub niceness: Niceness,}impl Kid { pub fn parse_row(csv_row: &str) -> Result<Kid, &'static str> { // 🎁 Transform the CSV row into a Kid struct for Santa's list! // 🎅 Expected CSV: "Name,GoodDeeds,BadDeeds" // Example: "Alice,3,1" -> name: "Alice", good_deeds: 3, bad_deeds: 1 // 🎁 Your code here! 🎁 // Returns an iterator which is stored in the fields variable let mut fields = csv_row.split(","); // next() is called on fields iterator to get the first field which is expected // to be name, match statement handles two cases let name = match fields.next() { // Some(field): if a field is found, it is converted to a string and assigned // to the name variable Some(field) => field.to_string(), // if no field is found, an error is returned with the message None => return Err("Missing name field"), }; let good_deeds = match fields.next() { Some(field) => field.parse::<u32>().map_err(|_| "Invalid good deeds field")?, None => return Err("Missing good deeds field"), }; let bad_deeds = match fields.next() { Some(field) => field.parse::<u32>().map_err(|_| "Invalid bad deeds field")?, None => return Err("Missing bad deeds field"), }; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Self { let niceness = if Self::is_nice(good_deeds, bad_deeds) { Niceness::Nice(good_deeds) } else { Niceness::Naughty }; Self { name, niceness } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_deeds = good_deeds as f32 * GOOD_WEIGHT; let bad_deeds = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_deeds / (good_deeds + bad_deeds); ratio >= 0.75 }}