use std::fmt;
use rupg_common::Oid;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TypeId(pub Oid);
impl TypeId {
pub const BOOL: TypeId = TypeId(Oid(16));
pub const BYTEA: TypeId = TypeId(Oid(17));
pub const INT8: TypeId = TypeId(Oid(20));
pub const INT2: TypeId = TypeId(Oid(21));
pub const INT4: TypeId = TypeId(Oid(23));
pub const TEXT: TypeId = TypeId(Oid(25));
pub const OID: TypeId = TypeId(Oid(26));
pub const FLOAT4: TypeId = TypeId(Oid(700));
pub const FLOAT8: TypeId = TypeId(Oid(701));
pub const DATE: TypeId = TypeId(Oid(1082));
pub const TIMESTAMP: TypeId = TypeId(Oid(1114));
pub const TIMESTAMPTZ: TypeId = TypeId(Oid(1184));
pub const UUID: TypeId = TypeId(Oid(2950));
pub const M1: [TypeId; 13] = [
TypeId::BOOL,
TypeId::BYTEA,
TypeId::INT8,
TypeId::INT2,
TypeId::INT4,
TypeId::TEXT,
TypeId::OID,
TypeId::FLOAT4,
TypeId::FLOAT8,
TypeId::DATE,
TypeId::TIMESTAMP,
TypeId::TIMESTAMPTZ,
TypeId::UUID,
];
pub fn from_oid(oid: Oid) -> Option<TypeId> {
TypeId::M1.into_iter().find(|t| t.0 == oid)
}
pub fn name(self) -> &'static str {
match self {
TypeId::BOOL => "bool",
TypeId::BYTEA => "bytea",
TypeId::INT8 => "int8",
TypeId::INT2 => "int2",
TypeId::INT4 => "int4",
TypeId::TEXT => "text",
TypeId::OID => "oid",
TypeId::FLOAT4 => "float4",
TypeId::FLOAT8 => "float8",
TypeId::DATE => "date",
TypeId::TIMESTAMP => "timestamp",
TypeId::TIMESTAMPTZ => "timestamptz",
TypeId::UUID => "uuid",
_ => "unknown",
}
}
pub fn sql_name(self) -> &'static str {
match self {
TypeId::BOOL => "boolean",
TypeId::INT8 => "bigint",
TypeId::INT2 => "smallint",
TypeId::INT4 => "integer",
TypeId::FLOAT4 => "real",
TypeId::FLOAT8 => "double precision",
TypeId::TIMESTAMP => "timestamp without time zone",
TypeId::TIMESTAMPTZ => "timestamp with time zone",
other => other.name(),
}
}
pub fn width(self) -> Option<u8> {
match self {
TypeId::BOOL => Some(1),
TypeId::INT2 => Some(2),
TypeId::INT4 | TypeId::OID | TypeId::FLOAT4 | TypeId::DATE => Some(4),
TypeId::INT8 | TypeId::FLOAT8 | TypeId::TIMESTAMP | TypeId::TIMESTAMPTZ => Some(8),
TypeId::UUID => Some(16),
_ => None,
}
}
}
impl fmt::Display for TypeId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.name())
}
}