Как я могу вернуть ошибку от Serde в функции, которая возвращает Result <(), Error> - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь вернуть ошибку Serde с помощью функции, которая возвращает Result<(), Error>:

use std::io::{Error};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Mine {
    ab: u8,
    ac: u8,
}
#[macro_use]
extern crate serde_derive;

fn main() {
    if do_match().is_ok() {
        println!("Success");
    }
}

fn do_match() -> Result<(), Error> {
    match serde_json::from_str::<Mine>("test") {
        Ok(_e) => println!("Okay"),
        Err(e) => return e,
    }
    Ok(())
}

Rust Playground

После различных попыток у меня не удалось исправить проблему, чтобы вернуть ошибку, как я могу это сделать?

1 Ответ

2 голосов
/ 13 января 2020

Во-первых, вы используете неправильный тип ошибки. serde_json::from_str s Err имеет тип serde_json::error::Error, тогда как вы используете std::io::Error. Во-вторых, путем сопоставления с шаблоном на Err(e) и затем с попыткой return e вы больше не возвращаете Result, а вместо этого пытаетесь просто вернуть что-то типа serde_json::error::Error. Вместо этого вы должны возвращать Result<(), serde_json::error::Error>. Вот правильный способ достижения sh того, чего вы пытаетесь достичь:

fn do_match() -> Result <(), serde_json::error::Error> {
    serde_json::from_str::<Mine>("test").map(|_| println!("Okay"))
}

map будет выполнять println!(...) только с результатом serde_json::from_str, если это Ok вариант, в противном случае он просто пройдет через вариант Err. Затем вы можете просто вернуть полученное выражение.

Rust Playground

...