Why does serde_json::from_reader take ownership of the reader?
Clash Royale CLAN TAG#URR8PPP
Why does serde_json::from_reader take ownership of the reader?
My code:
fn request_add<T>(request: &mut Request, collection_name: &'static str) -> Fallible<Fallible<String>>
where
T: serde::Serialize + serde::de::DeserializeOwned,
let add_dao = dao::MongoDao::new(collection_name);
let obj = serde_json::from_reader::<Body, T>(request.body)?; //cannot move out of borrowed content
Ok(add_dao.add(&obj))
I have a cannot move out of borrowed content
error, because request
is a reference, but why does serde_json::from_reader
not use a mut reference? Why does it need ownership? And how can I fix it?
cannot move out of borrowed content
request
serde_json::from_reader
1 Answer
1
Because it's an API guideline:
R: Read
W: Write
The standard library contains these two impls:
impl<'a, R: Read + ?Sized> Read for &'a mut R /* ... */
impl<'a, W: Write + ?Sized> Write for &'a mut W /* ... */
That means any function that accepts R: Read
or W: Write
generic
parameters by value can be called with a mut
reference if necessary.
R: Read
W: Write
mut
You either call Read::by_ref
or just take a reference yourself:
Read::by_ref
serde_json::from_reader(&mut request.body)
serde_json::from_reader(request.body.by_ref())
See also:
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.