diff --git a/rasql-core/src/rust/simple_type_gen.rs b/rasql-core/src/rust/simple_type_gen.rs index 36ece71..3429cb8 100644 --- a/rasql-core/src/rust/simple_type_gen.rs +++ b/rasql-core/src/rust/simple_type_gen.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; use crate::rust::{ - sql_ident_to_field_name, sql_ident_to_type_name, type_gen::UnsupportedDataType, - GeneratedTableStruct, IdPromoteMode, ModuleCodeGenConfig, StructCodeGenConfig, - StructFieldCodeGenConfig, TableStruct, TableStructField, + sql_ident_to_field_name, sql_ident_to_module_name, sql_ident_to_type_name, + type_gen::UnsupportedDataType, GeneratedTableStruct, IdPromoteMode, ModuleCodeGenConfig, + StructCodeGenConfig, StructFieldCodeGenConfig, TableStruct, TableStructField, }; fn generate_table_struct_and_impls( @@ -107,50 +107,42 @@ fn sql_datatype_to_rust_type( syn::Type::Verbatim(quote::quote! {i16}) } sqlparser::ast::DataType::UnsignedInt2(_) => syn::Type::Verbatim(quote::quote! {u16}), - sqlparser::ast::DataType::Int16 => todo!(), - sqlparser::ast::DataType::Int128 => todo!(), - sqlparser::ast::DataType::Int256 => todo!(), sqlparser::ast::DataType::Int(_) - | sqlparser::ast::DataType::Int32 | sqlparser::ast::DataType::Int4(_) | sqlparser::ast::DataType::Integer(_) => syn::Type::Verbatim(quote::quote! {i32}), - sqlparser::ast::DataType::UnsignedInt(_) => todo!(), - sqlparser::ast::DataType::UnsignedInt4(_) => todo!(), - sqlparser::ast::DataType::UnsignedInteger(_) => todo!(), - sqlparser::ast::DataType::UInt8 => todo!(), - sqlparser::ast::DataType::UInt16 => todo!(), - sqlparser::ast::DataType::UInt32 => todo!(), - sqlparser::ast::DataType::UInt64 => todo!(), - sqlparser::ast::DataType::UInt128 => todo!(), - sqlparser::ast::DataType::UInt256 => todo!(), - sqlparser::ast::DataType::Int8(_) - | sqlparser::ast::DataType::Int64 - | sqlparser::ast::DataType::BigInt(_) => syn::Type::Verbatim(quote::quote! {i64}), - sqlparser::ast::DataType::UnsignedBigInt(_) => todo!(), - sqlparser::ast::DataType::UnsignedInt8(_) => todo!(), + sqlparser::ast::DataType::Int8(_) | sqlparser::ast::DataType::BigInt(_) => { + syn::Type::Verbatim(quote::quote! {i64}) + } sqlparser::ast::DataType::Float(_) | sqlparser::ast::DataType::Float4 - | sqlparser::ast::DataType::Real - | sqlparser::ast::DataType::Float32 => syn::Type::Verbatim(quote::quote! {f32}), - sqlparser::ast::DataType::Float64 - | sqlparser::ast::DataType::Float8 + | sqlparser::ast::DataType::Real => syn::Type::Verbatim(quote::quote! {f32}), + sqlparser::ast::DataType::Float8 | sqlparser::ast::DataType::Double(..) | sqlparser::ast::DataType::DoublePrecision => syn::Type::Verbatim(quote::quote! {f64}), - sqlparser::ast::DataType::Bool => todo!(), - sqlparser::ast::DataType::Boolean => todo!(), - sqlparser::ast::DataType::Date => todo!(), - sqlparser::ast::DataType::Date32 => todo!(), - sqlparser::ast::DataType::Time(_, timezone_info) => todo!(), - sqlparser::ast::DataType::Datetime(_) => todo!(), - sqlparser::ast::DataType::Datetime64(_, _) => todo!(), - sqlparser::ast::DataType::Timestamp(_, timezone_info) => todo!(), - sqlparser::ast::DataType::Interval => todo!(), - sqlparser::ast::DataType::JSON => todo!(), - sqlparser::ast::DataType::JSONB => todo!(), - sqlparser::ast::DataType::Regclass => todo!(), - sqlparser::ast::DataType::Bit(_) => todo!(), - sqlparser::ast::DataType::BitVarying(_) => todo!(), - sqlparser::ast::DataType::Custom(object_name, vec) => todo!(), + sqlparser::ast::DataType::Bool | sqlparser::ast::DataType::Boolean => { + syn::Type::Verbatim(quote::quote! {bool}) + } + sqlparser::ast::DataType::Date => syn::Type::Verbatim(quote::quote! {time::Date}), + sqlparser::ast::DataType::Time(_, _) => syn::Type::Verbatim(quote::quote! {time::Time}), + sqlparser::ast::DataType::Timestamp(_, _) => { + syn::Type::Verbatim(quote::quote! {time::PrimitiveDateTime}) + } + sqlparser::ast::DataType::Interval => syn::Type::Verbatim(quote::quote! {time::Duration}), + sqlparser::ast::DataType::JSON | sqlparser::ast::DataType::JSONB => { + syn::Type::Verbatim(quote::quote! {time::Duration}) + } + sqlparser::ast::DataType::Custom(object_name, vec) => { + if object_name.0.len() == 1 { + let rust_type_name = sql_ident_to_type_name(&object_name.0[0]); + syn::Type::Verbatim(quote::quote! {crate::#rust_type_name}) + } else { + let rust_type_name = + sql_ident_to_type_name(&object_name.0[object_name.0.len() - 1]); + let rust_module_name = + sql_ident_to_module_name(&object_name.0[object_name.0.len() - 2]); + syn::Type::Verbatim(quote::quote! {crate::#rust_module_name::#rust_type_name}) + } + } sqlparser::ast::DataType::Array(array_elem_type_def) => match array_elem_type_def { sqlparser::ast::ArrayElemTypeDef::None => { return Err(UnsupportedDataType(datatype.clone())) @@ -162,16 +154,6 @@ fn sql_datatype_to_rust_type( syn::Type::Verbatim(quote::quote! {Vec<#inner_type>}) } }, - sqlparser::ast::DataType::Map(data_type, data_type1) => todo!(), - sqlparser::ast::DataType::Tuple(vec) => todo!(), - sqlparser::ast::DataType::Nested(vec) => todo!(), - sqlparser::ast::DataType::Enum(vec, _) => todo!(), - sqlparser::ast::DataType::Set(vec) => todo!(), - sqlparser::ast::DataType::Struct(vec, struct_bracket_kind) => todo!(), - sqlparser::ast::DataType::Union(vec) => todo!(), - sqlparser::ast::DataType::Nullable(data_type) => todo!(), - sqlparser::ast::DataType::LowCardinality(data_type) => todo!(), - sqlparser::ast::DataType::Trigger => todo!(), _ => return Err(UnsupportedDataType(datatype.clone())), }) }