Menu
Coddy logo textTech

Executando a Tela

Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 53 de 61.

challenge icon

Desafio

Fácil

Parabéns por chegar à etapa final do projeto do Sistema de Documentos! Você construiu todas as peças individuais — a trait Draw, TextField, Button e Screen. Agora é hora de dar à sua Screen a capacidade de renderizar todos os seus componentes de uma só vez com uma única chamada de método.

Você completará seu projeto adicionando um método run à struct Screen. Este método percorrerá todos os componentes armazenados na tela e chamará draw() em cada um, dando vida a todo o seu sistema de documentos.

Seus arquivos de projeto:

  • draw.rs: Sua trait Draw com o método draw.
  • text_field.rs: Seu componente TextField que imprime "Text: {}".
  • button.rs: Seu componente Button que imprime "Button: {} (width: {})".
  • screen.rs: Sua struct Screen com os métodos new e add. Adicione um método run que recebe &self e chama draw() em cada componente da coleção.
  • main.rs: Reúna tudo — crie uma 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 da Screen, tornando sua função principal limpa e simples. Em vez de iterar manualmente pelos componentes em main, você apenas chama screen.run().

As seguintes entradas serão fornecidas:

  • Primeira linha: o conteúdo do campo de texto (text field)
  • Segunda linha: o rótulo (label) do botão
  • Terceira linha: a largura (width) 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 para screen.run()
    for component in &screen.components {
        component.draw();
    }
}

Todas as lições de Object Oriented Programming