1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use crate::ffi;

#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum TypeId {
    Boolean,
    TinyInt,
    SmallInt,
    Integer,
    BigInt,
    UTinyInt,
    USmallInt,
    UInteger,
    UBigInt,
    Float,
    Double,
    Timestamp,
    Date,
    Time,
    Interval,
    HugeInt,
    VarChar,
    Blob,
    Decimal,
    TimestampS,
    TimestampMs,
    TimestampNs,
    Enum,
    List,
    Struct,
    Map,
    Uuid,
    Union,
    Bit,
}

impl TypeId {
    pub unsafe fn from_raw(ty: ffi::duckdb_type) -> Option<Self> {
        use TypeId::*;
        match ty {
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_INVALID => None,
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_BOOLEAN => Some(Boolean),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TINYINT => Some(TinyInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_SMALLINT => Some(SmallInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_INTEGER => Some(Integer),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_BIGINT => Some(BigInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_UTINYINT => Some(UTinyInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_USMALLINT => Some(USmallInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_UINTEGER => Some(UInteger),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_UBIGINT => Some(UBigInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_FLOAT => Some(Float),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_DOUBLE => Some(Double),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP => Some(Timestamp),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_DATE => Some(Date),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIME => Some(Time),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_INTERVAL => Some(Interval),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_HUGEINT => Some(HugeInt),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_VARCHAR => Some(VarChar),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_BLOB => Some(Blob),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_DECIMAL => Some(Decimal),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_S => Some(TimestampS),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_MS => Some(TimestampMs),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_NS => Some(TimestampNs),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_ENUM => Some(Enum),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_LIST => Some(List),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_STRUCT => Some(Struct),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_MAP => Some(Map),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_UUID => Some(Uuid),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_UNION => Some(Union),
            ffi::DUCKDB_TYPE_DUCKDB_TYPE_BIT => Some(Bit),
            _ => unreachable!("DUCKDB_TYPE"),
        }
    }
    pub fn to_raw(self) -> ffi::duckdb_type {
        use TypeId::*;
        match self {
            Boolean => ffi::DUCKDB_TYPE_DUCKDB_TYPE_BOOLEAN,
            TinyInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TINYINT,
            SmallInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_SMALLINT,
            Integer => ffi::DUCKDB_TYPE_DUCKDB_TYPE_INTEGER,
            BigInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_BIGINT,
            UTinyInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_UTINYINT,
            USmallInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_USMALLINT,
            UInteger => ffi::DUCKDB_TYPE_DUCKDB_TYPE_UINTEGER,
            UBigInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_UBIGINT,
            Float => ffi::DUCKDB_TYPE_DUCKDB_TYPE_FLOAT,
            Double => ffi::DUCKDB_TYPE_DUCKDB_TYPE_DOUBLE,
            Timestamp => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP,
            Date => ffi::DUCKDB_TYPE_DUCKDB_TYPE_DATE,
            Time => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIME,
            Interval => ffi::DUCKDB_TYPE_DUCKDB_TYPE_INTERVAL,
            HugeInt => ffi::DUCKDB_TYPE_DUCKDB_TYPE_HUGEINT,
            VarChar => ffi::DUCKDB_TYPE_DUCKDB_TYPE_VARCHAR,
            Blob => ffi::DUCKDB_TYPE_DUCKDB_TYPE_BLOB,
            Decimal => ffi::DUCKDB_TYPE_DUCKDB_TYPE_DECIMAL,
            TimestampS => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_S,
            TimestampMs => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_MS,
            TimestampNs => ffi::DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_NS,
            Enum => ffi::DUCKDB_TYPE_DUCKDB_TYPE_ENUM,
            List => ffi::DUCKDB_TYPE_DUCKDB_TYPE_LIST,
            Struct => ffi::DUCKDB_TYPE_DUCKDB_TYPE_STRUCT,
            Map => ffi::DUCKDB_TYPE_DUCKDB_TYPE_MAP,
            Uuid => ffi::DUCKDB_TYPE_DUCKDB_TYPE_UUID,
            Union => ffi::DUCKDB_TYPE_DUCKDB_TYPE_UNION,
            Bit => ffi::DUCKDB_TYPE_DUCKDB_TYPE_BIT,
        }
    }
}