I am trying to read the results from a SQL query, iterate over the returned Vector
, and transform the Row
into a domain object. I'm passing the row by reference, so I am not sure where the temporary value is being returned back from the function.
What am I doing wrong here?
use postgres::{Client, Error, Row}; // 0.17.1
#[derive(Debug)]
pub struct SomeTable<'a> {
id: i32,
value: &'a str,
}
impl SomeTable<'_> {
pub fn new(row: &Row) -> Result<SomeTable, Error> {
let id_value: i32 = match row.try_get(0) {
Ok(n) => n,
Err(e) => return Err(e),
};
let some_value: &str = match row.try_get(1) {
Ok(n) => n,
Err(e) => return Err(e),
};
Ok(SomeTable {
id: id_value,
value: some_value,
})
}
}
pub fn get_values(client: &mut Client, value: String) -> Result<Vec<SomeTable>, Error> {
let mut vec = Vec::new();
let results = client
.query("select * from some_table where value=$1", &[&value])?
.iter();
for row in results {
let details = SomeTable::new(&row)?;
vec.push(details);
}
Ok(vec)
}
I keep getting this error
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:40:5
|
31 | let results = client
| ___________________-
32 | | .query("select * from some_table where value=$1", &[&value])?
| |_____________________________________________________________________- temporary value created here
...
40 | Ok(vec)
| ^^^^^^^ returns a value referencing data owned by the current function