pub mod create_input;
pub mod include_input;
pub mod order_by_input;
pub mod relation_meta;
pub mod select_input;
pub mod update_input;
pub mod where_input;
pub mod where_unique_input;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use syn::Ident;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FilterCategory {
String,
Int,
BigInt,
Float,
Decimal,
Bool,
Bytes,
Uuid,
Json,
DateTime,
Date,
Time,
#[allow(dead_code)]
Enum,
}
pub fn filter_category_for(type_name: &str) -> Option<FilterCategory> {
match type_name {
"String" => Some(FilterCategory::String),
"Int" | "i32" => Some(FilterCategory::Int),
"BigInt" | "i64" => Some(FilterCategory::BigInt),
"Float" | "f64" => Some(FilterCategory::Float),
"Decimal" | "rust_decimal::Decimal" => Some(FilterCategory::Decimal),
"Boolean" | "bool" => Some(FilterCategory::Bool),
"Bytes" | "Vec<u8>" | "Vec" => Some(FilterCategory::Bytes),
"Uuid" | "uuid::Uuid" => Some(FilterCategory::Uuid),
"Json" | "serde_json::Value" | "Value" => Some(FilterCategory::Json),
"DateTime" | "chrono::DateTime<chrono::Utc>" => Some(FilterCategory::DateTime),
"Date" | "chrono::NaiveDate" | "NaiveDate" => Some(FilterCategory::Date),
"Time" | "chrono::NaiveTime" | "NaiveTime" => Some(FilterCategory::Time),
_ => None,
}
}
pub fn filter_wrapper_ident(cat: FilterCategory, nullable: bool) -> Ident {
let name = match (cat, nullable) {
(FilterCategory::String, false) => "StringFilter",
(FilterCategory::String, true) => "StringNullableFilter",
(FilterCategory::Int, false) => "IntFilter",
(FilterCategory::Int, true) => "IntNullableFilter",
(FilterCategory::BigInt, false) => "BigIntFilter",
(FilterCategory::BigInt, true) => "BigIntNullableFilter",
(FilterCategory::Float, false) => "FloatFilter",
(FilterCategory::Float, true) => "FloatNullableFilter",
(FilterCategory::Decimal, false) => "DecimalFilter",
(FilterCategory::Decimal, true) => "DecimalNullableFilter",
(FilterCategory::Bool, false) => "BoolFilter",
(FilterCategory::Bool, true) => "BoolNullableFilter",
(FilterCategory::Bytes, false) => "BytesFilter",
(FilterCategory::Bytes, true) => "BytesNullableFilter",
(FilterCategory::Uuid, false) => "UuidFilter",
(FilterCategory::Uuid, true) => "UuidNullableFilter",
(FilterCategory::Json, false) => "JsonFilter",
(FilterCategory::Json, true) => "JsonNullableFilter",
(FilterCategory::DateTime, false) => "DateTimeFilter",
(FilterCategory::DateTime, true) => "DateTimeNullableFilter",
(FilterCategory::Date, false) => "DateFilter",
(FilterCategory::Date, true) => "DateNullableFilter",
(FilterCategory::Time, false) => "TimeFilter",
(FilterCategory::Time, true) => "TimeNullableFilter",
(FilterCategory::Enum, false) => "EnumFilter",
(FilterCategory::Enum, true) => "EnumNullableFilter",
};
format_ident!("{}", name)
}
pub fn update_wrapper_ident(cat: FilterCategory, nullable: bool) -> Ident {
let name = match (cat, nullable) {
(FilterCategory::String, false) => "StringFieldUpdate",
(FilterCategory::String, true) => "StringNullableFieldUpdate",
(FilterCategory::Int, false) => "IntFieldUpdate",
(FilterCategory::Int, true) => "IntNullableFieldUpdate",
(FilterCategory::BigInt, false) => "BigIntFieldUpdate",
(FilterCategory::BigInt, true) => "BigIntNullableFieldUpdate",
(FilterCategory::Float, false) => "FloatFieldUpdate",
(FilterCategory::Float, true) => "FloatNullableFieldUpdate",
(FilterCategory::Decimal, false) => "DecimalFieldUpdate",
(FilterCategory::Decimal, true) => "DecimalNullableFieldUpdate",
(FilterCategory::Bool, false) => "BoolFieldUpdate",
(FilterCategory::Bool, true) => "BoolNullableFieldUpdate",
(FilterCategory::Bytes, false) => "BytesFieldUpdate",
(FilterCategory::Bytes, true) => "BytesNullableFieldUpdate",
(FilterCategory::Uuid, false) => "UuidFieldUpdate",
(FilterCategory::Uuid, true) => "UuidNullableFieldUpdate",
(FilterCategory::Json, false) => "JsonFieldUpdate",
(FilterCategory::Json, true) => "JsonNullableFieldUpdate",
(FilterCategory::DateTime | FilterCategory::Date | FilterCategory::Time, false) => {
"DateTimeFieldUpdate"
}
(FilterCategory::DateTime | FilterCategory::Date | FilterCategory::Time, true) => {
"DateTimeNullableFieldUpdate"
}
(FilterCategory::Enum, false) => "EnumFieldUpdate",
(FilterCategory::Enum, true) => "EnumNullableFieldUpdate",
};
format_ident!("{}", name)
}
pub fn scalar_payload_type(cat: FilterCategory) -> Option<TokenStream> {
Some(match cat {
FilterCategory::String => quote! { ::std::string::String },
FilterCategory::Int => quote! { i32 },
FilterCategory::BigInt => quote! { i64 },
FilterCategory::Float => quote! { f64 },
FilterCategory::Decimal => quote! { ::rust_decimal::Decimal },
FilterCategory::Bool => quote! { bool },
FilterCategory::Bytes => quote! { ::std::vec::Vec<u8> },
FilterCategory::Uuid => quote! { ::uuid::Uuid },
FilterCategory::Json => quote! { ::serde_json::Value },
FilterCategory::DateTime => quote! { ::chrono::DateTime<::chrono::Utc> },
FilterCategory::Date => quote! { ::chrono::NaiveDate },
FilterCategory::Time => quote! { ::chrono::NaiveTime },
FilterCategory::Enum => return None,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn filter_category_for_accepts_every_spelling() {
assert_eq!(filter_category_for("String"), Some(FilterCategory::String));
assert_eq!(filter_category_for("Int"), Some(FilterCategory::Int));
assert_eq!(filter_category_for("i32"), Some(FilterCategory::Int));
assert_eq!(filter_category_for("BigInt"), Some(FilterCategory::BigInt));
assert_eq!(filter_category_for("i64"), Some(FilterCategory::BigInt));
assert_eq!(filter_category_for("Float"), Some(FilterCategory::Float));
assert_eq!(filter_category_for("f64"), Some(FilterCategory::Float));
assert_eq!(
filter_category_for("Decimal"),
Some(FilterCategory::Decimal)
);
assert_eq!(
filter_category_for("rust_decimal::Decimal"),
Some(FilterCategory::Decimal)
);
assert_eq!(filter_category_for("Boolean"), Some(FilterCategory::Bool));
assert_eq!(filter_category_for("bool"), Some(FilterCategory::Bool));
assert_eq!(filter_category_for("Bytes"), Some(FilterCategory::Bytes));
assert_eq!(filter_category_for("Vec<u8>"), Some(FilterCategory::Bytes));
assert_eq!(filter_category_for("Vec"), Some(FilterCategory::Bytes));
assert_eq!(filter_category_for("Uuid"), Some(FilterCategory::Uuid));
assert_eq!(
filter_category_for("uuid::Uuid"),
Some(FilterCategory::Uuid)
);
assert_eq!(filter_category_for("Json"), Some(FilterCategory::Json));
assert_eq!(
filter_category_for("serde_json::Value"),
Some(FilterCategory::Json)
);
assert_eq!(filter_category_for("Value"), Some(FilterCategory::Json));
assert_eq!(
filter_category_for("DateTime"),
Some(FilterCategory::DateTime)
);
assert_eq!(
filter_category_for("chrono::DateTime<chrono::Utc>"),
Some(FilterCategory::DateTime)
);
assert_eq!(filter_category_for("Date"), Some(FilterCategory::Date));
assert_eq!(filter_category_for("NaiveDate"), Some(FilterCategory::Date));
assert_eq!(filter_category_for("Time"), Some(FilterCategory::Time));
assert_eq!(filter_category_for("NaiveTime"), Some(FilterCategory::Time));
assert_eq!(filter_category_for("UnknownType"), None);
assert_eq!(filter_category_for(""), None);
}
#[test]
fn scalar_payload_type_is_none_only_for_enum() {
assert!(scalar_payload_type(FilterCategory::String).is_some());
assert!(scalar_payload_type(FilterCategory::Int).is_some());
assert!(scalar_payload_type(FilterCategory::Bytes).is_some());
assert!(scalar_payload_type(FilterCategory::Json).is_some());
assert!(scalar_payload_type(FilterCategory::DateTime).is_some());
assert!(scalar_payload_type(FilterCategory::Enum).is_none());
}
}