упр.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 функцията извикай метода и принтирай резултата (успех или грешка).

Задължително прочетете (или си припомнете): Указания за предаване на домашни