dbui-database 0.0.64

Database access and schema introspection for dbui
Documentation
use anyhow::Result;
use dbui_core::field_type::FieldType;
use tokio_postgres::types::FromSql;
use uuid::Uuid;

pub(crate) fn array_to_string(row: &postgres::row::Row, idx: usize, t: &FieldType) -> Result<Option<String>> {
  match t {
    FieldType::String => Ok(get_array_opt::<String>(row, idx)?.map(|v| format!("{:?}", v))),

    FieldType::Boolean => Ok(get_array_opt::<bool>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::Char => Ok(get_array_opt::<i8>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::I16 => Ok(get_array_opt::<i16>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::I32 => Ok(get_array_opt::<i32>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::U32 => Ok(get_array_opt::<u32>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::I64 => Ok(get_array_opt::<i64>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::F32 => Ok(get_array_opt::<f32>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::F64 => Ok(get_array_opt::<f64>(row, idx)?.map(|v| format!("{:?}", v))),

    FieldType::Date => Ok(get_array_opt::<chrono::NaiveDate>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::Time => Ok(get_array_opt::<chrono::NaiveTime>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::Timestamp => Ok(get_array_opt::<chrono::NaiveDateTime>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::TimestampZoned => Ok(get_array_opt::<chrono::DateTime<chrono::Utc>>(row, idx)?.map(|v| format!("{:?}", v))),

    FieldType::Uuid => Ok(get_array_opt::<Uuid>(row, idx)?.map(|v| format!("{:?}", v))),
    FieldType::Json => Ok(get_array_opt::<serde_json::Value>(row, idx)?.map(|v| {
      let x: Vec<String> = v
        .iter()
        .map(|j| match serde_json::to_string_pretty(&j) {
          Ok(s) => s,
          Err(e) => format!("Error writing json: [{:?}]", e)
        })
        .collect();
      format!("{:?}", x)
    })),
    FieldType::StringMap => Ok(get_array_opt::<std::collections::HashMap<String, Option<String>>>(row, idx)?.map(|v| format!("{:?}", v))),

    _ => Ok(Some(format!("List[{:?}]", t)))
  }
}

fn get_array_opt<'a, T: FromSql<'a>>(row: &'a postgres::row::Row, idx: usize) -> Result<Option<Vec<T>>> {
  let o: Result<Option<Vec<T>>> = crate::get_idx(row, idx);
  o
}