- I have the following code:
fn setup_ws_handler<'a, ToClient>(url: &str, sender: mpsc::Sender<ToClient>) where
ToClient: serde::Deserialize<'a> + 'static + Clone
{
let ws = WebSocket::new(url).unwrap();
{ let url = url.to_string();
ws.add_event_listener( move |_: SocketOpenEvent| {
console!(log, format!("connection opened: {}", url) ); } ); }
{ let url = url.to_string();
ws.add_event_listener( move |_: SocketErrorEvent| {
console!(log, format!("connection errored: {}", url) ); } ); }
{ let url = url.to_string();
ws.add_event_listener( move |event: SocketCloseEvent| {
console!(log, format!("connection closed: {} : {:?}", url, event.reason())); } ); }
ws.add_event_listener( move |event: SocketMessageEvent| {
let data = event.data().into_text().unwrap();
let to_client: ToClient = serde_json::from_str(&data).unwrap() ;
sender.send(to_client.clone());
});
}
- It is generating the following error:
|
18 | fn setup_ws_handler<'a, ToClient>(url: &str, sender: mpsc::Sender<ToClient>) where
| -- lifetime `'a` defined here
...
38 | let to_client: ToClient = serde_json::from_str(&data).unwrap() ;
| ---------------------^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `data` is borrowed for `'a`
39 | sender.send(to_client.clone());
40 | });
| - `data` dropped here while still borrowed
-
I am confused for the following reason:
-
let data = ...
has type String, so there is no lifetime issue. -
I deserialize it to a ToClient. Why do I get an error here?
-
Before putting it in the channel, I even do a useless clone, to make sure that the "to_client" only has to live for a very short amount of time.