Menu
Coddy logo textTech

Executando a Tela

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 53 de 61.

challenge icon

Desafio

Fácil

Parabéns por chegar à etapa final do projeto Document System! Você criou todas as partes individuais: o trait Draw, TextField, Button e Screen. Agora é hora de dar ao seu Screen a capacidade de renderizar todos os seus componentes de uma só vez com uma única chamada de método.

Você concluirá seu projeto adicionando um método run à struct Screen. Esse método iterará por todos os componentes armazenados na tela e chamará draw() em cada um deles, dando vida ao seu sistema de documentos completo.

Seus arquivos do projeto:

  • draw.rs: Seu trait Draw com o método draw.
  • text_field.rs: Seu componente TextField que imprime Text: {content}.
  • button.rs: Seu componente Button que imprime Button: {label} (width: {width}).
  • screen.rs: Sua struct Screen com os métodos new e add. Adicione um método run que receba &self e chame draw() em cada componente da coleção.
  • main.rs: Reúna tudo: crie um Screen, adicione seus componentes e chame run() para renderizar a tela inteira de uma só vez.

O método run encapsula a lógica de renderização dentro de Screen, mantendo sua função principal limpa e simples. Em vez de iterar manualmente pelos componentes em main, basta chamar screen.run().

As seguintes entradas serão fornecidas:

  • Primeira linha: o conteúdo do campo de texto
  • Segunda linha: o rótulo do botão
  • Terceira linha: a largura do botão (como um número)

Sua saída deve exibir cada componente em sua própria linha, na ordem em que foram adicionados:

Text: Dashboard
Button: Save (width: 120)

Experimente você mesmo

mod draw;
mod text_field;
mod button;
mod screen;

use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;

pub struct Label {
    pub text: String,
}

impl Draw for Label {
    fn draw(&self) {
        println!("{}", self.text);
    }
}

fn main() {
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let content = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let label = input2.trim().to_string();

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let width: u32 = input3.trim().parse().expect("Failed to parse width");

    let mut screen = Screen::new();

    let text_field = TextField { content };
    screen.add(Box::new(text_field));

    let button = Button { label, width };
    screen.add(Box::new(button));

    // TODO: Substitua a iteração manual abaixo por uma única chamada a screen.run()
    for component in &screen.components {
        component.draw();
    }
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online