gluesql_derive/
lib.rs

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    /// statically define expression
47    fn to_gluesql_row(&self) -> Vec<ExprNode<'static>>;
48}