تمرين إعادة البناء
Inventory Report
أعد كتابة تقرير مخزون يحسب القيمة ويحدد الأصناف منخفضة الكمية.
rust
~20 دقيقة
متوسط
أعد بناء الكود
Rebuild
هذا هو الكود. اكتبه بنفسك.
الكود المرجعي
use std::env;
use std::fs;
use std::io;
#[derive(Debug)]
struct Item {
sku: String,
name: String,
quantity: i64,
reorder_at: i64,
unit_halalas: i64,
}
fn main() -> io::Result<()> {
let path = env::args()
.nth(1)
.unwrap_or_else(|| "inventory.csv".to_string());
let data = fs::read_to_string(path).unwrap_or_else(|_| sample_inventory());
let items = parse_items(&data);
let total_value: i64 = items
.iter()
.map(|item| item.quantity * item.unit_halalas)
.sum();
for item in &items {
if item.quantity <= item.reorder_at {
println!(
"LOW: {} {} has {} left",
item.sku, item.name, item.quantity
);
}
}
println!("Inventory value: {}", format_money(total_value));
Ok(())
}
fn parse_items(data: &str) -> Vec<Item> {
data.lines()
.skip(1)
.filter_map(|line| {
let fields: Vec<_> = line.split(',').map(str::trim).collect();
Some(Item {
sku: fields.get(0)?.to_string(),
name: fields.get(1)?.to_string(),
quantity: fields.get(2)?.parse().ok()?,
reorder_at: fields.get(3)?.parse().ok()?,
unit_halalas: fields.get(4)?.parse().ok()?,
})
})
.collect()
}
fn sample_inventory() -> String {
"sku,name,quantity,reorder_at,unit_halalas\nD01,Dates,8,10,2500\nC01,Coffee,25,8,1800\nT01,Tea,5,6,1400\n".to_string()
}
fn format_money(halalas: i64) -> String {
format!("{}.{:02} SAR", halalas / 100, halalas.abs() % 100)
}اكتب هنا