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 mut fields = csv_row.split(","); let name = fields.next().ok_or("No name")?.to_string(); let good_deeds = fields.next().ok_or("empty")?.parse::<u32>().map_err(|_| " Invalid CSV format.")?; let bad_deeds = fields.next().ok_or("empty")?.parse::<u32>().map_err(|_| "Invalid CSV 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 let mut fields = csv_row.split(','); let name = fields.next().ok_or("No name!")?; let good_deeds: u32 = fields.next() .ok_or("No good deeds!")? .parse::<u32>() .map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = fields.next() .ok_or("No bad deeds!")? .parse::<u32>() .map_err(|_| "Invalid bad deeds")?; Ok(Self::new(String::from(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;pub const GOOD_THRESHOLD: f32 = 0.75;#[derive(Debug, PartialEq)] // needed for testspub 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 row_iter = csv_row.split(','); let name = row_iter .next() .ok_or("Invalid CSV format: Empty line")? .to_string(); let good_deeds = row_iter .next() .ok_or("Invalid CSV format: No good deeds")? .parse::<u32>() .map_err(|_| "Invalid CSV format: Good deeds is not a valid positive number")?; let bad_deeds = row_iter .next() .ok_or("Invalid CSV format: No bad deeds")? .parse::<u32>() .map_err(|_| "Invalid CSV format: Bad deeds is not a valid positive number")?; Ok(Self::new(name, good_deeds, bad_deeds)) } pub fn new(name: String, good_deeds: u32, bad_deeds: u32) -> Kid { Kid { name: name, niceness: Kid::is_nice(good_deeds, bad_deeds) .then(|| Niceness::Nice(good_deeds)) .unwrap_or(Niceness::Naughty), } } pub fn is_nice(good_deeds: u32, bad_deeds: u32) -> bool { if good_deeds == 0 && bad_deeds == 0 { return false; } let good_score = good_deeds as f32 * GOOD_WEIGHT; let bad_score = bad_deeds as f32 * BAD_WEIGHT; let ratio = good_score / (good_score + bad_score); ratio >= GOOD_THRESHOLD }}
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 words = csv_row.split(',').collect::<Vec<_>>(); if words.len() != 3 { return Err("Bad field count"); } if words[0].is_empty() { return Err("Invalid name"); } let Ok(good_deeds) = words[1].parse::<u32>() else { return Err("Invalid good_deeds"); }; let Ok(bad_deeds) = words[2].parse::<u32>() else { return Err("Invalid bad_deeds"); }; Ok(Self::new(words[0].into(), 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 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("Invalid row.") } let name = parts[0].to_string(); let good_deeds = parts[1].parse::<u32>().map_err(|_|"Could not parse second argument to good deeds")?; let bad_deeds = parts[2].parse::<u32>().map_err(|_|"Could not parse third argument to 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 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("Invalid CSV format; expected 3 values separated by commas.") } let name: String = parts[0].to_string(); let good_deeds: u32 = parts[1] .parse::<u32>() .map_err(|_|"Could not parse good deeds as u32")?; let bad_deeds: u32 = parts[2] .parse::<u32>() .map_err(|_|"Could not parse bad deeds as 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 parts: Vec<&str> = csv_row.split(",").collect(); if parts.len() != 3 { return Err("Invalid CSV format; expected 3 values separated by commas.") } let name: String = String::from(parts[0]); let good_deeds: u32 = parts[1] .parse::<u32>() .map_err(|_|"Could not parse good deeds as u32")?; let bad_deeds: u32 = parts[2] .parse::<u32>() .map_err(|_|"Could not parse bad deeds as u32")?; Ok(Self::new(String::from(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 parts = csv_row.split(","); let name: &str = parts.next() .ok_or("Couldn't parse name")?; let good_deeds: u32 = parts.next() .ok_or("Invalid good deeds")? .parse::<u32>() .map_err(|_|"Could not parse good deeds as u32")?; let bad_deeds: u32 = parts.next() .ok_or("Invalid bad deeds")? .parse::<u32>() .map_err(|_|"Could not parse bad deeds as u32")?; Ok(Self::new(String::from(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 vec: Vec<&str> = csv_row.split(',').collect(); if vec.len() != 3 { return Err("Invalid CSV format: expected 3 fields"); } if vec[0].is_empty() || vec[1].is_empty() || vec[2].is_empty() { return Err("Empty field found in CSV"); } let name: String = vec[0].to_string(); let good_deeds: u32 = vec[1].parse() .map_err(|_| "Invalid number for good deeds")?; let bad_deeds: u32 = vec[2].parse() .map_err(|_| "Invalid number for 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 let mut splits = csv_row.split(","); let name_entry = splits.next().ok_or("Missing field")?; let good_deeds_entry = splits.next().ok_or("Missing field")?; let bad_deeds_entry = splits.next().ok_or("Missing field")?; let name = name_entry.to_string(); let good_deeds = good_deeds_entry.parse::<u32>().map_err(|_| "Unable to parse")?; let bad_deeds = bad_deeds_entry.parse::<u32>().map_err(|_| "Unable to parse")?; 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 parts = csv_row.split(","); let name: String = parts.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = parts.next().ok_or("Missing field")?.parse().map_err(|_|"Invalid good deeds")?; let bad_deeds: u32 = 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 parts: Vec<&str> = csv_row.split(",").collect(); if parts.len() != 3 { return Err("invalid length") }; let name = parts[0].to_string(); let good_deeds = parts[1].parse().map_err(|_| "good_deeds can't be parsed")?; let bad_deeds = parts[2].parse().map_err(|_| "bad_deeds can't be parsed")?; 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 parts: Vec<&str> = csv_row.split(",").collect(); if parts.len() != 3 { return Err("invalid row"); } let name = parts[0]; let good_deeds: u32 = match parts[1].parse() { Ok(n) => n, Err(_e) => return Err("invalid good deeds"), }; let bad_deeds: u32 = match parts[2].parse() { Ok(n) => n, Err(_e) => return Err("invalid bad deeds"), }; Ok(Self::new(name.to_owned(), 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 parts = csv_row.split(','); let name = match parts.next() { Some(v) => v.to_string(), None => return Err("missing name column"), }; let good_deeds: u32 = match parts.next() { Some(v_str) => match v_str.parse() { Err(_) => return Err("invlid good_deeds type"), Ok(v) => v, }, None => return Err("missing good_deeds column"), }; let bad_deeds: u32 = match parts.next() { Some(v_str) => match v_str.parse() { Err(_) => return Err("invlid bad_deeds type"), Ok(v) => v, }, None => return Err("missing bad_deeds column"), }; 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 fn main() {}
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 v: Vec<&str> = csv_row.split(',').collect(); match v.as_slice() { [name, good_str, bad_str] => { let good_deeds: u32 = good_str.parse().map_err(|_| "Invalid good_deeds")?; let bad_deeds: u32 = bad_str.parse().map_err(|_| "Invalid bad_deeds")?; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) } _ => Err("Invalid CSV row format. Expected 3 fields."), } } 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 [name, good, bad] = csv_row.split(",").collect::<Vec<&str>>().try_into().map_err(|_| "No 3 elements")?; let good_deeds = good.parse::<u32>().map_err(|_| "Not an integer")?; let bad_deeds = bad.parse::<u32>().map_err(|_| "Not an integer")?; 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 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 csv_row = csv_row.split(','); let name = csv_row.next().ok_or("no name")?.to_string(); let good_deeds = csv_row.next().ok_or("no good deeds")?.parse::<u32>().map_err(|_| "no good deeds")?; let bad_deeds = csv_row.next().ok_or("no bad deeds")?.parse::<u32>().map_err(|_| "no 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 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 csv: Vec<&str> = csv_row.split(',').collect(); if csv.len() != 3 { return Err("Invalid input") }; let name = csv[0].to_string(); let good_deeds: u32 = match csv[1].parse() { Ok(num) => num, Err(_) => return Err("Not a number") }; let bad_deeds: u32 = match csv[2].parse() { Ok(num) => num, Err(_) => return 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 { 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 csv: Vec<&str> = csv_row.split(",").collect(); if csv.len() != 3 { return Err("Three columns necessery: name, good_deeds, bad_deeds"); }; let name = String::from(csv[0]); let good_deeds = match csv[1].parse() { Ok(number) => number, Err(_) => return Err("Good deeds must be a number"), }; let bad_deeds = match csv[2].parse() { Ok(number) => number, Err(_) => return Err("Bad deeds must be 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 let fields: Vec<_> = csv_row.split(',').collect(); if fields.len() != 3 { return Err("Missing columns"); } else if fields.contains(&"") { return Err("Empty columns"); } else { let name = fields[0].to_string(); let good_deeds: u32 = match fields[1].parse() { Ok(num) => num, Err(_) => return Err("Good deeds not unsigned integer") }; let bad_deeds: u32 = match fields[2].parse() { Ok(num) => num, Err(_) => return Err("Bad deeds not unsigned integer") }; 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! 🎁 println!("{}", csv_row); let parts : Vec<&str> = csv_row.split(',').collect(); // THIS IS THE LINE TO CHANGE: Replace assert! with an if condition that returns Err if parts.len() != 3 { return Err("invalid input"); // Or a more specific error message like "Invalid CSV format: Expected 3 parts" } let good_deeds: u32 = match parts[1].parse::<u32>() { Ok(num) => num, Err(_) => return Err("Invalid format for GoodDeeds: Not a valid number"), }; let bad_deeds: u32 = match parts[2].parse::<u32>() { Ok(num) => num, Err(_) => return Err("Invalid format for BadDeeds: Not a valid number"), }; Ok(Self::new(String::from(parts[0]), 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 split_string = csv_row.split(","); let name = split_string.next().ok_or("Missing field")?.to_string(); let good_deeds: u32 = split_string .next() .ok_or("Missing field")? .parse() .map_err(|_| "Invalid good deeds")?; let bad_deeds: u32 = split_string .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 items = csv_row.split(","); Ok(Self::new( items.next().ok_or("Expecting name")?.to_string(), items.next().ok_or("Missing good deeds")?.parse().map_err(|_| "Invalid good deeds")?, items.next().ok_or("Missing bad deeds")?.parse().map_err(|_| "Invalid 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 parts = csv_row.split(',').collect::<Vec<_>>(); if parts.len() == 3 { let (name, good_deeds, bad_deeds) = ( parts[0].into(), parts[1].parse().map_err(|_| "Invalid data")?, parts[2].parse().map_err(|_| "Invalid data")?, ); Ok(Self::new(name, good_deeds, bad_deeds)) } else { return Err("invalid input"); } } 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 = fields.next().ok_or("Missing good deeds")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds = 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 mut fields = csv_row.split(','); let name = fields.next().ok_or("Missing name")?.to_string(); let good_deeds = fields.next().ok_or("Missing good deeds")?.parse().map_err(|_| "Invalid good deeds")?; let bad_deeds = 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 chunks: Vec<_> = csv_row.split(",").collect(); match chunks.as_slice() { [name, good_deeds, bad_deeds] => { let good_deeds: u32 = good_deeds.parse::<u32>().map_err(|_| "Invalid Good Deed")?; let bad_deeds: u32 = bad_deeds.parse::<u32>().map_err(|_| "Invalid Bad Deed")?; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) } _ => Err("input row not valid"), } } 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(','); //1 Obtener el nombre let name = fields.next() .ok_or("Missing field")? .to_string(); //2 Obteenr buenas aciones let good_deeds = fields.next() .ok_or("Missing field")? .parse::<u32>() .map_err(|_|"Invalid good deeds")?; //3 Obtener Malas acciones let bad_deeds = fields.next() .ok_or("Missing bad deeds")? .parse::<u32>() .map_err(|_|"Invalid bad deeds")?; Ok(Kid::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 members = csv_row.split(",").collect::<Vec<_>>(); match members.as_slice() { [name, good_deeds, bad_deeds] => { let good_deeds = good_deeds.parse::<u32>().map_err(|_| "Invalid Good Deeds")?; let bad_deeds = bad_deeds.parse::<u32>().map_err(|_| "Invalid Bad Deeds")?; Ok(Self::new(name.to_string(), good_deeds, bad_deeds)) }, _ => Err("Invalid CSV format") } } 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 vec : Vec<&str> = csv_row.split(",").collect(); if vec.len() < 3 { return Err("Invalid CSV row"); } let name = vec[0].to_string(); let good_deeds = match vec[1].parse::<u32>() { Ok(n) => n, Err(_) => return Err("Problem parsing good_deeds") }; let bad_deeds = match vec[2].parse::<u32>() { Ok(n) => n, Err(_) => return Err("Problem parsing 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 csv_row_iter = csv_row.split(","); let name: &str = csv_row_iter.next().unwrap(); let good_deeds: u32 = if let Some(deeds_str) = csv_row_iter.next(){ match deeds_str.parse::<u32>() { Ok(var) => var, Err(_e) => return Err("Error in good_deeds") } } else { return Err("Missing good_deeds") }; let bad_deeds: u32 = if let Some(deeds_str) = csv_row_iter.next(){ match deeds_str.parse::<u32>() { Ok(var) => var, Err(_e) => return Err("Error in bad_deeds") } } else { return Err("Missing good_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 // 🎁 Your code here! 🎁 let parts = csv_row.split(','); match parts.collect::<Vec<&str>>().as_slice() { [name, good_deeds, bad_deeds] => { let good_deeds = good_deeds.parse::<u32>().map_err(|_| "Invalid Good Deeds")?; let bad_deeds = bad_deeds.parse::<u32>().map_err(|_| "Invalid Bad Deeds")?; Ok(Kid::new(name.to_string(), good_deeds, bad_deeds)) } _ => Err("Invalid CSV format"), } } 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 mut fields = csv_row.split(","); let name = fields.next().ok_or("Missing name")?; let good_deeds = fields.next().ok_or("Missing good deeds")? .parse().map_err(|_| "Invalid good deeds")?; let bad_deeds = fields.next().ok_or("Missing bad deeds")? .parse().map_err(|_| "Invalid 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 mut values = csv_row.split(","); let name = match values.next() { Some(name) => name, None => return Err("Didn't receive a name") }; let good_deeds = match values.next() { Some(good_deeds) => good_deeds, None => return Err("Didn't receive good deeds") }; let bad_deeds = match values.next() { Some(bad_deeds) => bad_deeds, None => return Err("Didn't receive bad deeds") }; let name = String::from(name); let good_deeds: u32 = match good_deeds.parse() { Ok(n) => n, Err(_) => return Err("Incorrect formatting") }; let bad_deeds: u32 = match bad_deeds.parse() { Ok(n) => n, Err(_) => return Err("Incorrect formatting") }; 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,}#[derive(Debug, PartialEq)]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 split = csv_row.split(","); let name = split.next().ok_or("name field missing")?; let good_deeds = split.next().ok_or("good_deeds field missing")?; let bad_deeds = split.next().ok_or("bad_deeds field missing")?; let good_deeds = good_deeds.parse().ok().ok_or("Failed to parse good_deeds")?; let bad_deeds = bad_deeds.parse().ok().ok_or("Failed to parse 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 }}#[cfg(test)]mod test { use crate::{Kid, Niceness}; #[test] fn test_parse_row() { assert_eq!(Kid::parse_row("Alice,3,1"), Ok(Kid { name: "Alice".to_string(), niceness: Niceness::Naughty })); assert_eq!(Kid::parse_row("Alice,6,1"), Ok(Kid { name: "Alice".to_string(), niceness: Niceness::Nice(6) })); } #[test] fn test_parse_row_errors() { assert!(Kid::parse_row("Alice").is_err()); assert!(Kid::parse_row("Alice,3").is_err()); assert!(Kid::parse_row("Alice,3,hi").is_err()); assert!(Kid::parse_row("Alice,hi,1").is_err()); }}
pub const GOOD_WEIGHT: f32 = 1.0;pub const BAD_WEIGHT: f32 = 2.0;#[derive(Debug, PartialEq)]pub enum Niceness { Nice(u32), Naughty,}#[derive(Debug, PartialEq)]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 split = csv_row.split(","); let name = split.next().ok_or("name field missing")?; let good_deeds = split.next().ok_or("good_deeds field missing")?; let bad_deeds = split.next().ok_or("bad_deeds field missing")?; let good_deeds = good_deeds.parse().ok().ok_or("Failed to parse good_deeds")?; let bad_deeds = bad_deeds.parse().ok().ok_or("Failed to parse 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 }}#[cfg(test)]mod test { use crate::{Kid, Niceness}; #[test] fn test_parse_row() { assert_eq!(Kid::parse_row("Alice,3,1"), Ok(Kid { name: "Alice".to_string(), niceness: Niceness::Naughty })); assert_eq!(Kid::parse_row("Alice,6,1"), Ok(Kid { name: "Alice".to_string(), niceness: Niceness::Nice(6) })); } #[test] fn test_parse_row_errors() { assert!(Kid::parse_row("Alice").is_err()); assert!(Kid::parse_row("Alice,3").is_err()); assert!(Kid::parse_row("Alice,3,hi").is_err()); assert!(Kid::parse_row("Alice,hi,1").is_err()); }}
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 fields: Vec<&str> = csv_row.trim().split(',').collect(); if fields.len() != 3 { return Err("Expected 3 fields: name, good_deeds, bad_deeds"); } let name = fields[0].to_string(); let good_deeds = fields[1].parse::<u32>().map_err(|_| "Invalid good_deeds")?; let bad_deeds = fields[2].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 row_iter = csv_row.split(","); // Getting name let name: Option<String> = row_iter.next().map(|name_str| String::from(name_str)); // Getting good deeds let good_deeds: Option<u32> = row_iter.next().and_then(|deeds| { deeds.parse::<u32>().ok() }); // Getting bad deeds let bad_deeds: Option<u32> = row_iter.next().and_then(|deeds| { deeds.parse::<u32>().ok() }); // Checking for invalid input if good_deeds.is_none() || bad_deeds.is_none() || name.is_none() { return Err("Invalid Input"); } // Unwrapping all the var and returning let name = name.unwrap(); let good_deeds = good_deeds.unwrap(); let bad_deeds = bad_deeds.unwrap(); 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("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 }}