postgres-mapper
postgres-mapper is a proc-macro designed to make mapping from postgresql
tables to structs simple.
Why?
It can be frustrating to write a lot of boilerplate and, ultimately, duplicated code for mapping from postgres Rows into structs.
For example, this might be what someone would normally write:
extern crate postgres;
use Row;
// code to execute a query here and get back a row
let user = from; // this can panic
This becomes worse when manually implementating using the non-panicking
get_opt method variant.
Using this crate, the boilerplate is removed, and panicking and non-panicking implementations are derived:
extern crate postgres_mapper_derive;
extern crate postgres_mapper;
use FromPostgresRow;
// Code to execute a query here and get back a row might now look like:
let stmt = "SELECT {$1} FROM {$2}
WHERE username = {$3} AND password = {$4}";
let rows = &self
.conn
.query.unwrap;
let user = rows
.iter
.next
.map;
The two crates
This repository contains two crates: postgres-mapper which contains an Error
enum and traits for converting from a postgres or tokio-postgres Row
without panicking, and postgres-mapper-derive which contains the proc-macro.
postgres-mapper-derive has 3 features that can be enabled (where T is the
struct being derived with the provided PostgresMapper proc-macro):
postgres-support, which derivesimpl<'a> From<::postgres::rows::Row<'a>> for Tandimpl<'a> From<&'a ::postgres::Row<'a>> for Timplementationstokio-postgres-support, which derivesimpl From<::tokio_postgres::rows::Row> for Tandimpl From<&::tokio_postgres::rows::Row> for Timplementationspostgres-mapperwhich, for each of the above features, implementspostgres-mapper'sFromPostgresRowand/orFromTokioPostgresRowtraits
postgres-mapper has two features, postgres-support and
tokio-postgres-support. When one is enabled in postgres-mapper-derive, it
must also be enabled in postgres-mapper.
Installation
The above might be confusing, so here's an example where tokio-postgres is
enabled in both crates:
Add the following to your Cargo.toml:
[]
= ["tokio-postgres-support"]
= "0.1"
[]
= ["postgres-mapper", "tokio-postgres-support"]
= "0.1"
This will derive implementations for converting from owned and referenced
tokio-postgres::rows::Rows, as well as implementing postgres-mapper's
FromTokioPostgresRow trait for non-panicking conversions.
License
ISC.