Types énumérés et structures

Les types énumérés et les structures (~30 minutes).

code final:

pub struct Texte {
    texte: String,
    style: Option<Style>,
    couleur: Option<Couleur>,
}

impl Texte {
    fn new(texte: String) -> Self {
        Texte {
            texte,
            style: None,
            couleur: None,
        }
    }
    fn change_couleur(&mut self, c: Couleur) {
        self.couleur = Some(c)
    }
    fn change_style(&mut self, s: Style) {
        self.style = Some(s)
    }
    fn affiche(&self) {
        let code_couleur = if let Some(c) = &self.couleur {
            c.code()
        } else {
            0
        };
        let code_style = self.style.as_ref().map(|s| s.code()).unwrap_or(0);
        println!(
            "\u{001b}[{};{}m{}\u{001b}[0m",
            code_couleur, code_style, self.texte
        );
    }
}

#[derive(Debug)]
enum Style {
    Clignote,
    Gras,
    Souligne,
}

impl Style {
    fn code(&self) -> u8 {
        match *self {
            Style::Gras => 1,
            Style::Souligne => 4,
            Style::Clignote => 5,
        }
    }
    fn affiche(&self, texte: &str) {
        println!("\u{001b}[;{}m{}\u{001b}[0m", self.code(), texte);
    }
}

enum Couleur {
    Rouge,
    Vert,
    Bleu,
    Maison(u8),
}

impl Couleur {
    fn code(&self) -> u8 {
        match *self {
            Couleur::Rouge => 31,
            Couleur::Vert => 32,
            Couleur::Bleu => 34,
            Couleur::Maison(c) => c,
        }
    }
    fn affiche(&self, texte: &str) {
        println!("\u{001b}[{}m{}\u{001b}[0m", self.code(), texte);
    }
}

fn main() {
    let mut t = Texte::new("coucou".to_owned());
    t.change_couleur(Couleur::Rouge);
    t.change_style(Style::Clignote);
    t.affiche();
}