use anyhow::Result;
use sqlx::any::AnyRow;
use sqlx::{Column, Row, TypeInfo};
use std::collections::BTreeMap;
use crate::domain::table_diff::RowMap;
use crate::infrastructure::db::dialect::RowDecoder;
pub fn row_to_map(
row: &AnyRow,
col_types: &BTreeMap<String, String>,
decoder: &dyn RowDecoder,
) -> Result<RowMap> {
let mut map = BTreeMap::new();
for col in row.columns() {
let name = col.name().to_string();
let anyrow_type = col.type_info().name();
let type_hint = col_types
.get(&name)
.map(|s| s.as_str())
.unwrap_or(anyrow_type);
let value = decoder.decode_column(row, col.ordinal(), type_hint)?;
map.insert(name, value);
}
Ok(map)
}