Skip to main content

wasi_pg_client/types/
mod.rs

1//! PostgreSQL type system: ToSql/FromSql, OID mapping, encoding.
2//!
3//! This module wraps the battle-tested [`postgres-types`](https://docs.rs/postgres-types)
4//! crate and adds **format-aware** `ToSql` / `FromSql` traits so the same
5//! traits can be used for both the **text** format (simple query) and the
6//! **binary** format (extended query).
7
8pub use postgres_types::{
9    Date, Field, IsNull, Kind, Oid, PgLsn, Timestamp, Type, WasNull, WrongType,
10};
11
12mod decode;
13mod encode;
14mod extern_types;
15mod format;
16mod oid;
17
18#[cfg(test)]
19mod tests;
20
21pub use decode::FromSql;
22pub use encode::ToSql;
23#[cfg(feature = "serde-json")]
24pub use extern_types::serde_json_impl::JsonB;
25pub use format::Format;
26pub use oid::*;
27
28/// Errors that can occur during type conversion or encoding/decoding.
29#[derive(Debug, thiserror::Error)]
30pub enum Error {
31    #[error("unsupported type: {0}")]
32    UnsupportedType(String),
33    #[error("conversion error: {0}")]
34    Conversion(String),
35    #[error("invalid data format: {0}")]
36    InvalidDataFormat(String),
37    #[error("utf-8 error: {0}")]
38    Utf8Error(#[from] std::str::Utf8Error),
39    #[error("parse int error: {0}")]
40    ParseIntError(#[from] std::num::ParseIntError),
41    #[error("parse float error: {0}")]
42    ParseFloatError(#[from] std::num::ParseFloatError),
43    #[error("parse bool error: {0}")]
44    ParseBoolError(#[from] std::str::ParseBoolError),
45    #[error("parse datetime error: {0}")]
46    ParseDateTimeError(String),
47    #[error("unknown OID: {0}")]
48    UnknownOid(u32),
49    #[error("unsupported encoding format for type: {0}")]
50    UnsupportedEncoding(String),
51    #[error("postgres-types error: {0}")]
52    PostgresTypes(String),
53}
54
55impl From<std::io::Error> for Error {
56    fn from(e: std::io::Error) -> Self {
57        Error::Conversion(e.to_string())
58    }
59}
60
61/// A specialized `Result` type for type system operations.
62pub type Result<T> = std::result::Result<T, Error>;
63
64/// Look up a `Type` by its OID.
65pub fn type_from_oid(oid: Oid) -> Option<Type> {
66    Type::from_oid(oid)
67}