我有一个自定义结构来映射从标准输入中获取的JSON。函数从stdin读取JSON并返回Result<MyCustomStruct, Error>
。我想在主要功能中使用该结构引用:
use serde::{Deserialize, Serialize};
use reqwest::Client;
use std::error::Error;
use std::io::Read;
#[derive(Deserialize, Debug)]
struct Bar {
pub id: String,
pub url: String,
}
#[derive(Deserialize, Debug)]
struct Foo {
pub bar: Bar,
}
pub struct ApiClient {
url: &'static str,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct RooStruct {
pub resp: String,
}
fn get_item_by_id(base_url: &str, _id: &str) -> Result<RooStruct, Box<Error>> {
let url = format!("{}{}{}", base_url, "/api/items/uid/", _id);
let client = Client::new();
let res: RooStruct = client.get(&url).send()?.json()?;
Ok(res)
}
impl ApiClient {
pub fn new(url: &'static str) -> ApiClient {
ApiClient { url: url }
}
pub fn get_item_by_id(&mut self, _id: &str) -> Result<RooStruct, Box<Error>> {
match get_item_by_id(self.url, _id) {
Ok(res) => Ok(res),
Err(e) => Err(e),
}
}
}
fn read_from_stdin() -> Result<Foo, Box<Error>> {
let mut input_buffer = String::new();
let stdin = std::io::stdin();
let mut handle = stdin.lock();
handle.read_to_string(&mut input_buffer)?;
let input: Foo = serde_json::from_str(&input_buffer)?;
Ok(input)
}
fn main() {
let stdin_input = read_from_stdin();
if stdin_input.is_err() {
println!("Error! {:?}", stdin_input.unwrap_err());
return;
}
let input = stdin_input.unwrap();
let bar = input.bar;
let id = bar.id;
let url = bar.url;
let mut client = ApiClient::new(&url);
// get_item_by_id expect &str as a param
match client.get_item_by_id(&id) {
Ok(res) => println!("Item: {:#?}", res),
Err(e) => println!("error fetching item: {:?}", e),
}
}
我希望获得结构体值引用,但出现此错误:
error[E0597]: `url` does not live long enough
--> src/main.rs:71:37
|
71 | let mut client = ApiClient::new(&url);
| ---------------^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `url` is borrowed for `'static`
...
78 | }
| - `url` dropped here while still borrowed```
我了解这意味着什么,但是我不确定如何正确实施生命周期。