Why does serde_json::from_reader take ownership of the reader?

  • A+
Category:Languages

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?

 


Because it's an API guideline:

Generic reader/writer functions take R: Read and W: Write by value (C-RW-VALUE)

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.

You either call Read::by_ref or just take a reference yourself:

serde_json::from_reader(&mut request.body) 
serde_json::from_reader(request.body.by_ref()) 

See also:

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: