use super::{Extension, Ident, Literal, NoExt, ObjectName};
use crate::vocab::Meta;
use thin_vec::ThinVec;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum DataType<X: Extension = NoExt> {
Boolean {
spelling: BooleanTypeName,
meta: Meta,
},
TinyInt {
display_width: Option<u32>,
meta: Meta,
},
SmallInt {
display_width: Option<u32>,
meta: Meta,
},
MediumInt {
display_width: Option<u32>,
meta: Meta,
},
Integer {
spelling: IntegerTypeName,
display_width: Option<u32>,
meta: Meta,
},
BigInt {
display_width: Option<u32>,
meta: Meta,
},
Decimal {
spelling: DecimalTypeName,
precision: Option<i32>,
scale: Option<i32>,
meta: Meta,
},
Float {
precision: Option<u32>,
meta: Meta,
},
Real {
meta: Meta,
},
Double {
spelling: DoubleTypeName,
meta: Meta,
},
Text {
spelling: TextTypeName,
charset: Option<Box<CharsetAnnotation>>,
meta: Meta,
},
Blob {
spelling: BlobTypeName,
meta: Meta,
},
Character {
spelling: CharacterTypeName,
size: Option<u32>,
charset: Option<Box<CharsetAnnotation>>,
meta: Meta,
},
Binary {
spelling: BinaryTypeName,
size: Option<u32>,
meta: Meta,
},
Bit {
varying: bool,
size: Option<u32>,
meta: Meta,
},
Json {
meta: Meta,
},
Uuid {
meta: Meta,
},
Date {
meta: Meta,
},
Time {
spelling: TimeTypeName,
precision: Option<u32>,
time_zone: TimeZone,
meta: Meta,
},
Timestamp {
spelling: TimestampTypeName,
precision: Option<u32>,
time_zone: TimeZone,
meta: Meta,
},
Interval {
fields: Option<IntervalFields>,
precision: Option<u32>,
meta: Meta,
},
Enum {
values: ThinVec<Literal>,
charset: Option<Box<CharsetAnnotation>>,
meta: Meta,
},
Set {
values: ThinVec<Literal>,
charset: Option<Box<CharsetAnnotation>>,
meta: Meta,
},
NumericModifier {
element: Option<Box<DataType<X>>>,
signedness: Signedness,
zerofill: bool,
meta: Meta,
},
Array {
element: Box<DataType<X>>,
size: Option<u32>,
spelling: ArrayTypeSpelling,
meta: Meta,
},
Struct {
fields: ThinVec<StructTypeField<X>>,
spelling: StructTypeSpelling,
meta: Meta,
},
Union {
members: ThinVec<StructTypeField<X>>,
meta: Meta,
},
Map {
key: Box<DataType<X>>,
value: Box<DataType<X>>,
meta: Meta,
},
Wrapped {
kind: WrappedTypeKind,
inner: Box<DataType<X>>,
meta: Meta,
},
FixedString {
length: u32,
meta: Meta,
},
DateTime64 {
precision: u32,
timezone: Option<Box<Literal>>,
meta: Meta,
},
Nested {
fields: ThinVec<StructTypeField<X>>,
meta: Meta,
},
FixedWidthInt {
signed: bool,
width: IntWidth,
meta: Meta,
},
UserDefined {
name: ObjectName,
modifiers: ThinVec<Literal>,
meta: Meta,
},
Liberal {
words: ThinVec<Ident>,
args: ThinVec<u32>,
meta: Meta,
},
Other {
ext: X,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructTypeField<X: Extension = NoExt> {
pub name: Ident,
pub ty: DataType<X>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum StructTypeSpelling {
Struct,
Row,
AngleBracket,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ArrayTypeSpelling {
Bracket,
Keyword,
AngleBracket,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WrappedTypeKind {
Nullable,
LowCardinality,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum BooleanTypeName {
Boolean,
Bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IntegerTypeName {
Int,
Integer,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IntWidth {
W8,
W16,
W32,
W64,
W128,
W256,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum DecimalTypeName {
Decimal,
Dec,
Numeric,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum DoubleTypeName {
DoublePrecision,
Double,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TextTypeName {
Text,
TinyText,
MediumText,
LongText,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum BlobTypeName {
Blob,
TinyBlob,
MediumBlob,
LongBlob,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Signedness {
Unspecified,
Signed,
Unsigned,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum CharacterTypeName {
Char,
Character,
CharVarying,
CharacterVarying,
Varchar,
Nchar,
NcharVarying,
NationalChar,
NationalCharVarying,
NationalCharacter,
NationalCharacterVarying,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct CharsetAnnotation {
pub charset: Option<Charset>,
pub name: Option<Ident>,
pub binary: bool,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Charset {
Named,
Ascii,
Unicode,
Byte,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum BinaryTypeName {
Binary,
BinaryVarying,
Varbinary,
Bytea,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TimeTypeName {
Time,
Timetz,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TimestampTypeName {
Timestamp,
Timestamptz,
Datetime,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TimeZone {
Unspecified,
WithTimeZone,
WithoutTimeZone,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IntervalFields {
Year,
Month,
Day,
Hour,
Minute,
Second,
YearToMonth,
DayToHour,
DayToMinute,
DayToSecond,
HourToMinute,
HourToSecond,
MinuteToSecond,
Week,
Quarter,
Decade,
Century,
Millennium,
Millisecond,
Microsecond,
DayToMicrosecond,
HourToMicrosecond,
MinuteToMicrosecond,
SecondToMicrosecond,
}