Finish sql_datatype_to_rust_type

This commit is contained in:
ZacJW 2025-06-17 08:15:13 +01:00
parent 120ac1e20d
commit 7aa5e6fd82

View file

@ -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())),
})
}