1use std::fmt;
4
5use rupg_common::Oid;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct TypeId(pub Oid);
10
11impl TypeId {
12 pub const BOOL: TypeId = TypeId(Oid(16));
14 pub const BYTEA: TypeId = TypeId(Oid(17));
16 pub const INT8: TypeId = TypeId(Oid(20));
18 pub const INT2: TypeId = TypeId(Oid(21));
20 pub const INT4: TypeId = TypeId(Oid(23));
22 pub const TEXT: TypeId = TypeId(Oid(25));
24 pub const OID: TypeId = TypeId(Oid(26));
26 pub const FLOAT4: TypeId = TypeId(Oid(700));
28 pub const FLOAT8: TypeId = TypeId(Oid(701));
30 pub const DATE: TypeId = TypeId(Oid(1082));
32 pub const TIMESTAMP: TypeId = TypeId(Oid(1114));
34 pub const TIMESTAMPTZ: TypeId = TypeId(Oid(1184));
36 pub const UUID: TypeId = TypeId(Oid(2950));
38
39 pub const M1: [TypeId; 13] = [
41 TypeId::BOOL,
42 TypeId::BYTEA,
43 TypeId::INT8,
44 TypeId::INT2,
45 TypeId::INT4,
46 TypeId::TEXT,
47 TypeId::OID,
48 TypeId::FLOAT4,
49 TypeId::FLOAT8,
50 TypeId::DATE,
51 TypeId::TIMESTAMP,
52 TypeId::TIMESTAMPTZ,
53 TypeId::UUID,
54 ];
55
56 pub fn from_oid(oid: Oid) -> Option<TypeId> {
58 TypeId::M1.into_iter().find(|t| t.0 == oid)
59 }
60
61 pub fn name(self) -> &'static str {
63 match self {
64 TypeId::BOOL => "bool",
65 TypeId::BYTEA => "bytea",
66 TypeId::INT8 => "int8",
67 TypeId::INT2 => "int2",
68 TypeId::INT4 => "int4",
69 TypeId::TEXT => "text",
70 TypeId::OID => "oid",
71 TypeId::FLOAT4 => "float4",
72 TypeId::FLOAT8 => "float8",
73 TypeId::DATE => "date",
74 TypeId::TIMESTAMP => "timestamp",
75 TypeId::TIMESTAMPTZ => "timestamptz",
76 TypeId::UUID => "uuid",
77 _ => "unknown",
78 }
79 }
80
81 pub fn sql_name(self) -> &'static str {
83 match self {
84 TypeId::BOOL => "boolean",
85 TypeId::INT8 => "bigint",
86 TypeId::INT2 => "smallint",
87 TypeId::INT4 => "integer",
88 TypeId::FLOAT4 => "real",
89 TypeId::FLOAT8 => "double precision",
90 TypeId::TIMESTAMP => "timestamp without time zone",
91 TypeId::TIMESTAMPTZ => "timestamp with time zone",
92 other => other.name(),
93 }
94 }
95
96 pub fn width(self) -> Option<u8> {
98 match self {
99 TypeId::BOOL => Some(1),
100 TypeId::INT2 => Some(2),
101 TypeId::INT4 | TypeId::OID | TypeId::FLOAT4 | TypeId::DATE => Some(4),
102 TypeId::INT8 | TypeId::FLOAT8 | TypeId::TIMESTAMP | TypeId::TIMESTAMPTZ => Some(8),
103 TypeId::UUID => Some(16),
104 _ => None,
105 }
106 }
107}
108
109impl fmt::Display for TypeId {
110 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
111 f.write_str(self.name())
112 }
113}