1#![doc = include_str!("../README.md")]
2
3use std::fmt::Debug;
4
5#[doc(hidden)]
6pub use gluesql_core;
7use gluesql_core::ast_builder::ExprNode;
8use gluesql_core::prelude::*;
9
10pub use gluesql_derive_proc::{FromGlueSqlRow, ReflectGlueSqlRow, ToGlueSqlRow};
11
12mod from_gluesql;
13pub use from_gluesql::FromGlueSql;
14mod to_gluesql;
15pub use to_gluesql::ToGlueSql;
16mod reflect_gluesql;
17pub use reflect_gluesql::ReflectGlueSql;
18#[derive(thiserror::Error)]
19pub enum Error {
20 #[error("could not convert into type {0}: {1:?}")]
21 InvalidConversion(&'static str, Value),
22 #[error("could not extract field: {0} {1:?}")]
23 InvalidExtract(usize, &'static str),
24 #[error("expected field {0} {1:?}, but actual label is {2:?}")]
25 InvalidFieldName(usize, &'static str, String),
26}
27impl Debug for Error {
28 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29 std::fmt::Display::fmt(self, f)
30 }
31}
32pub trait ReflectGlueSqlRow {
33 fn get_ddl(table: &str) -> String;
34 fn columns() -> Vec<&'static str>;
35}
36pub trait FromGlueSqlRow: Sized {
37 fn from_gluesql_row(labels: &[String], row: Vec<Value>) -> Result<Self, Error>;
38 fn from_gluesql_rows(labels: &[String], rows: Vec<Vec<Value>>) -> Result<Vec<Self>, Error> {
39 rows.into_iter()
40 .map(|row| Self::from_gluesql_row(labels, row))
41 .collect()
42 }
43}
44
45pub trait ToGlueSqlRow {
46 fn to_gluesql_row(&self) -> Vec<ExprNode<'static>>;
48}