use std::{
borrow::Cow,
ops::{Deref, DerefMut},
};
use indexmap::IndexMap;
use mysql_async::{prelude::FromRow, Column, FromRowError, Row};
use serde::{Deserialize, Serialize};
use crate::Value;
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct TypedValues(pub IndexMap<String, Value>);
impl FromRow for TypedValues {
#[allow(clippy::needless_collect)]
fn from_row_opt(row: Row) -> Result<Self, FromRowError> {
let column_names_lossy = row
.columns_ref()
.iter()
.map(Column::name_str)
.map(Cow::into_owned)
.collect::<Vec<String>>();
let values = row.unwrap().into_iter().map(Value::from);
let values = column_names_lossy
.into_iter()
.zip(values)
.collect::<IndexMap<String, Value>>();
Ok(TypedValues(values))
}
}
impl Deref for TypedValues {
type Target = IndexMap<String, Value>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for TypedValues {
fn deref_mut(self: &mut TypedValues) -> &mut Self::Target {
&mut self.0
}
}