упр.03 задача 1
- Краен срок:
- 28.10.2026 23:59
- Точки:
- 4
Ще пишеш модул за обработка на онлайн поръчки. В зависимост от състоянието на поръчката, метода на плащане и евентуалните грешки, системата трябва да взима различни решения чрез софтуерно съпоставяне (match).
Дефинирай следните enum структури:
-
PaymentMethod: Метод на плащане:
- CreditCard { number: String, cvv: String }
- PayPal { email: String }
- CashOnDelivery (наложен платеж)
-
OrderStatus: Текущ етап на поръчката:
- Pending - чака плащане
- Paid { amount: f64 }
- Shipped { tracking_number: String }
- Cancelled { reason: String }
-
OrderEvent: Събития, които могат да постъпят в системата:
- PaymentReceived { amount: f64 }
- ItemShipped { tracking_number: String }
- CustomerCancelled
- RefundRequested
Дефинирай структурата Order:
- id: u64 (номер на поръчката)
- customer_name: String
- status: OrderStatus
- payment_method: PaymentMethod
Методи и impl блок за Order:
Добави следните методи към Order в impl блок:
- fn new(id: u64, customer_name: String, payment_method: PaymentMethod) -> Self — Създава нова поръчка с начален статус OrderStatus::Pending.
- fn process_event(&mut self, event: OrderEvent) -> Result<(), String> — Главното ядро на задачата. Използвай match върху комбинация (кортеж / tuple) от текущия статус (self.status) и постъпилото събитие (event), за да решиш как да промениш състоянието.
Примерни правила за преход:
- Ако поръчката е Pending и получим PaymentReceived { amount }, статусът става Paid { amount }.
- Ако поръчката е Paid и получим ItemShipped { tracking_number }, статусът става Shipped { tracking_number }.
- Ако поръчката е Pending или Paid и клиентът поиска отказ (CustomerCancelled), статусът става Cancelled { reason: String }.
За всякакви други невалидни комбинации (напр. се опитваме да пратим вече отказана поръчка), върни Err(String) с подходящо съобщение за грешка. В main функцията извикай метода и принтирай резултата (успех или грешка).
Задължително прочетете (или си припомнете): Указания за предаване на домашни
