Estou tentando analisar algumas entradas do usuário. As entradas são armazenadas em uma estrutura onde há muitas opções/resultados (para lidar com os dados não inicializados antes que o usuário os insira) e quando o usuário os envia, eles precisam ir para uma estrutura onde todos os valores são conhecidos.
Gostaria de poder ter um vetor com quaisquer erros para que eu possa dar feedback ao usuário sobre todos os erros com a entrada (não apenas o primeiro). No entanto, não consigo encontrar uma boa maneira de fazer isso.
struct Test {
x: i32,
y: String,
}
#[derive(Debug)]
enum Errors {
OneIsNone,
TwoIsNone,
}
Minha abordagem atual é:
fn main() -> Result<Test, Vec<Errors>> {
let option1 = Some(5);
let option2 = None;
let mut errors = Vec::new();
let x: i32;
match option1 {
Some(value) => x = value,
None => errors.push(Errors::OneIsNone),
};
let y: String;
match option2 {
Some(value) => y = value,
None => errors.push(Errors::TwoIsNone),
}
if errors.len() != 0 {
return Err(errors)
}
Ok(
Test {
x,
y
}
)
}
O que não funciona porque o compilador não consegue dizer que x e y devem ser inicializados se o código atingir o Ok
bloco.
Nesse caso, eu poderia simplesmente desembrulhar e corresponder os dois resultados, mas essa abordagem se tornaria terrivelmente desajeitada para estruturas com um grande número de campos.
Basicamente, quero uma maneira de receber um grande número de resultados e analisá-los em uma estrutura se todos eles fornecerem Ok()
ou retornarem um vetor contendo todos os erros, caso contrário, como implementar unwrap_or_errors
em
fn main() -> Result<Test, Vec<Errors>> {
let option1 = Some(5);
let option2 = None;
let mut errors = Vec::new();
let x = match option1 {
Some(val) => Ok(val),
None => Err(Errors::OneIsNone),
};
let y = match option2 {
Some(val) => Ok(val),
None => Err(Errors::TwoIsNone),
};
if errors.len() != 0 {
return Err(errors)
}
Test::unwrap_or_errors(x, y)?
}