Rust Lifetime, что я делаю не так?

Я пытаюсь написать функцию, которая принимает строку URL и вызывает другой сервис, который выдает JSON. Детали того, как этот вызов сделан, удалены в образце ниже.

я хочу иметь from_str() заполнить экземпляр структуры T с ответом. Если я в строке query функция в main тогда это компилируется.

Прости все unwraps() но я хотел урезать код.

Что я делаю неправильно?

extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;

use serde::de;

fn query_as_t<'a, T>(_url: &'a str) -> Result<T, serde_json::Error>
where
    T: de::Deserialize<'a>,
{
    // MAKE AN HTTP CALL TO URL AND GET JSON
    let text: String = "JSON OBTAINED FROM HTTP CALL TO URL ABOVE".to_string();
    // this is where the ds:Deserialize is required
    serde_json::from_str(&text)
}

#[derive(Serialize, Deserialize)]
struct Foo {
    a: String,
}

fn main() {
    let _decoded: Foo = query_as_t("http://foo:123").unwrap();
}
error[E0597]: `text` does not live long enough
  --> src/main.rs:15:27
   |
15 |     serde_json::from_str(&text)
   |                           ^^^^ borrowed value does not live long enough
16 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the function body at 8:1...
  --> src/main.rs:8:1
   |
8  | / fn query_as_t<'a, T>(_url: &'a str) -> Result<T, serde_json::Error>
9  | | where
10 | |     T: de::Deserialize<'a> + 'a,
11 | | {
...  |
15 | |     serde_json::from_str(&text)
16 | | }
   | |_^

Cargo.toml

[dependencies]

serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

0 ответов

Другие вопросы по тегам