Как преобразовать serde_ json :: error :: Error в reqwest :: error :: Error? - PullRequest
4 голосов
/ 06 января 2020

reqwest v0.9 имеет serde v1.0 в качестве зависимости и в результате реализует преобразование ошибок serde_ json в reqwest error .

В моем коде я делаю некоторые десериализация с использованием serde_ json вместо использования метода .json(), поставляемого с reqwest.

// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, reqwest::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}

В настоящее время я пытаюсь вернуть ошибки serde_ json как ошибки reqwest. Изменение let metas: Vec<Meta> = serde_json::from_value(data).unwrap(); на let metas: Vec<Meta> = serde_json::from_value(data)?; завершается неудачно со следующей ошибкой:

 the trait `std::convert::From<serde_json::error::Error>` is not implemented for `reqwest::error::Error`

Можно ли преобразовать serde_json::error::Error в reqwest::error::Error, поместив его в Kind::Json перечисление ошибки reqwest или я должны сделать пользовательский список ошибок, который охватывает оба, как упомянуто в этой статье ?

1 Ответ

1 голос
/ 06 января 2020

Нет, вы не можете создать reqwest::Error для себя, потому что оно:

  • имеет непубличные c поля
  • не раскрывает publi c конструкторы
  • не имеют From реализаций для publi c типов

К счастью, оба reqwest::Error и serde_json::error::Error реализуют черту std::error::Error. Следуя рекомендациям поста, на который вы ссылаетесь, ящик anyhow очень полезен:

// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"
// anyhow = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, anyhow::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...