AzLearn

تمرين إعادة البناء

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)
}
اكتب هنا