mirror of https://github.com/01-edu/public.git
119 lines
2.7 KiB
Markdown
119 lines
2.7 KiB
Markdown
## events
|
||
|
||
### Instructions
|
||
|
||
You have to design a notification system for a platform.
|
||
|
||
Depending on the type of event, your event handler will control the size, color and position of the notification.
|
||
|
||
Create a method named `notify` which returns a `Notification` with the following characteristics for each of:
|
||
- `Remainder(text)`:
|
||
- `size`: `50`
|
||
- `color`: `(50, 50, 50)`
|
||
- `position`: `Bottom`
|
||
- `content`: the `text` associated to the enum variant
|
||
- `Registration(chrono::Duration)`:
|
||
- `size`: `30`
|
||
- `color`: `(255, 2, 22)`
|
||
- `position`: `Top`
|
||
- `content`: `"You have {duration} left before the registration ends"`
|
||
- `Appointment(text)`:
|
||
- `size`: `100`
|
||
- `color`: `(200, 200, 3)`
|
||
- `position`: `Center`
|
||
- `content`: `text associated to the value`
|
||
- `Holiday`:
|
||
- `size`: `25`
|
||
- `color`: `(0, 255, 0)`
|
||
- `position`: `Top`
|
||
- `content`: `"Enjoy your holiday"`
|
||
|
||
`duration` must be displayed in the form of `{hours}H:{minutes}M:{seconds}S`. The time will represent the remaining time before the event starts. For example, if there are 13 hours, 38 minutes and 14 seconds left, then the content will be `"You have 13H:38M:14S left before the registration ends"`
|
||
|
||
Implement the `std::fmt::Display` trait so the text of the notifications are printed in the right color in the command line.
|
||
|
||
|
||
### Dependencies
|
||
|
||
chrono = "0.4"
|
||
|
||
colored = "2.0.0"
|
||
|
||
### Expected Functions and Data Structures
|
||
|
||
```rust
|
||
use chrono::Duration;
|
||
use colored::*;
|
||
|
||
#[derive(Debug, Eq, PartialEq)]
|
||
pub enum Position {
|
||
Top,
|
||
Bottom,
|
||
Center,
|
||
}
|
||
|
||
#[derive(Debug, Eq, PartialEq)]
|
||
pub struct Notification {
|
||
pub size: u32,
|
||
pub color: (u8, u8, u8),
|
||
pub position: Position,
|
||
pub content: String,
|
||
}
|
||
|
||
#[derive(Debug)]
|
||
pub enum Event<'a> {
|
||
Remainder(&'a str),
|
||
Registration(Duration),
|
||
Appointment(&'a str),
|
||
Holiday,
|
||
}
|
||
|
||
use std::fmt;
|
||
|
||
impl fmt::Display for Notification {
|
||
}
|
||
|
||
use Event::*;
|
||
|
||
impl Event {
|
||
pub fn notify(&self) -> Notification {
|
||
}
|
||
}
|
||
```
|
||
|
||
### Usage
|
||
|
||
Here is a program to test your function.
|
||
|
||
```rust
|
||
use events::Event::*;
|
||
use chrono::Duration;
|
||
|
||
fn main() {
|
||
let remainder = Remainder("Go to the doctor");
|
||
println!("{}", remainder.notify());
|
||
let registration = Registration(Duration::seconds(49094));
|
||
println!("{}", registration.notify());
|
||
let appointment = Appointment("Go to the doctor");
|
||
println!("{}", appointment.notify());
|
||
let holiday = Holiday;
|
||
println!("{}", holiday.notify());
|
||
}
|
||
```
|
||
|
||
And its output
|
||
|
||
```console
|
||
$ cargo run
|
||
(Bottom, 50, [38;2;50;50;50mGo to the doctor[0m)
|
||
(Top, 30, [38;2;255;2;22mYou have 13H:38M:14S left before the registration ends[0m)
|
||
(Center, 100, [38;2;200;200;3mGo to the doctor[0m)
|
||
(Top, 25, [38;2;0;255;0mEnjoy your holiday[0m)
|
||
$
|
||
```
|
||
|
||
### Notions
|
||
|
||
- [colored crate](https://docs.rs/colored/2.0.0/colored/)
|
||
- [chrono crate](https://crates.io/crates/chrono)
|