Exercício 1
Gere a seção [package] do Cargo.toml
stub.rs
// manifest_package gera a seção [package] de um Cargo.toml: quatro linhas
// separadas por \n, sem quebra final, com os valores entre aspas duplas.
pub fn manifest_package(name: &str, version: &str, edition: &str) -> String {
// implemente:
format!("{name} {version} {edition}")
}
harness.rs
fn json_escape(value: &str) -> String {
value
.replace('\\', "\\\\")
.replace('"', "\\\"")
.replace('\n', "\\n")
}
fn print_result(case: usize, pass: bool, input: &str, want: &str, got: &str) {
println!(
"RESULT {{\"case\":{case},\"pass\":{pass},\"input\":\"{}\",\"want\":\"{}\",\"got\":\"{}\"}}",
json_escape(input),
json_escape(want),
json_escape(got)
);
}
fn main() {
let cases = [
(
("oficina", "0.1.0", "2024"),
"[package]\nname = \"oficina\"\nversion = \"0.1.0\"\nedition = \"2024\"",
),
(
("servidor-web", "1.2.3", "2024"),
"[package]\nname = \"servidor-web\"\nversion = \"1.2.3\"\nedition = \"2024\"",
),
(
("cli", "0.0.1", "2021"),
"[package]\nname = \"cli\"\nversion = \"0.0.1\"\nedition = \"2021\"",
),
];
for (index, ((name, version, edition), want)) in cases.iter().enumerate() {
let got = manifest_package(name, version, edition);
let pass = got == *want;
print_result(
index + 1,
pass,
&format!("({name:?}, {version:?}, {edition:?})"),
want,
&got,
);
}
}
cases.json
[
{
"case": 1,
"input": "(\"oficina\", \"0.1.0\", \"2024\")",
"want": "[package]\nname = \"oficina\"\nversion = \"0.1.0\"\nedition = \"2024\""
},
{
"case": 2,
"input": "(\"servidor-web\", \"1.2.3\", \"2024\")",
"want": "[package]\nname = \"servidor-web\"\nversion = \"1.2.3\"\nedition = \"2024\""
},
{
"case": 3,
"input": "(\"cli\", \"0.0.1\", \"2021\")",
"want": "[package]\nname = \"cli\"\nversion = \"0.0.1\"\nedition = \"2021\""
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | ("oficina", "0.1.0", "2024") |
[package]
name = "oficina"
version = "0.1.0"
edition = "2024" |
| 2 | ("servidor-web", "1.2.3", "2024") |
[package]
name = "servidor-web"
version = "1.2.3"
edition = "2024" |
| 3 | ("cli", "0.0.1", "2021") |
[package]
name = "cli"
version = "0.0.1"
edition = "2021" |
Execute com o Cargo local
- Execute os comandos de preparação.
- Copie os arquivos acima para os arquivos vazios com os mesmos nomes.
- Execute a verificação de base. O stub deve mostrar o comportamento atual.
Comandos de preparação
cargo new --bin --edition 2024 imersao-02-instalacao-e-cargo-exercicio-1
cd imersao-02-instalacao-e-cargo-exercicio-1
touch stub.rs harness.rs cases.json
printf 'include!("../stub.rs");\ninclude!("../harness.rs");\n' > src/main.rs
Verificação de base — confirme o comportamento atual antes da mudança
cargo fmt --check
cargo run --bin imersao-02-instalacao-e-cargo-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- A saída tem quatro linhas fixas: o cabeçalho [package] e os três campos name, version e edition — cada valor entre aspas duplas.
- format! aceita \n para quebra de linha e \" para aspas dentro do molde; monte as quatro linhas em uma única chamada, sem \n no final.
Revelar solução
solution.rs
// manifest_package gera a seção [package] de um Cargo.toml: quatro linhas
// separadas por \n, sem quebra final, com os valores entre aspas duplas.
pub fn manifest_package(name: &str, version: &str, edition: &str) -> String {
format!("[package]\nname = \"{name}\"\nversion = \"{version}\"\nedition = \"{edition}\"")
}
Um único format! com \n entre as linhas reproduz o arquivo que o cargo new gera; a armadilha é esquecer as aspas em volta dos valores ou acrescentar uma quebra de linha final que os casos não esperam.