rp1 0.3.1

Easily generate a REST-like CRUD API using Rocket and Diesel
Documentation
RP1 is a [Diesel] based CRUD for [Rocket]. To get started with RP1 you can read
the project setup below, which will guide to through setting up a basic
application. If you already have a running rocket/diesel application you should
continue with reading the docs for the [crud] macro, which will explain the
basic setup and explain all options that the crud generation has.

[Diesel]: https://diesel.rs/
[Rocket]: https://rocket.rs/

## Example
This is an example of what RP1 allows you to create (note that we assume that
you already have a schema definition for the users table generated by diesel).

```rust
#[macro_use]
extern crate diesel;

mod schema;

use rocket_sync_db_pools::database;

#[database("diesel")]
struct Db(diesel::PgConnection);

#[rp1::crud(database = "Db", table = "users", auth = false)]
struct User {
    #[primary_key]
    pub id: i32,
    #[validate(email)]
    username: String,
    role: String,
    #[generated]
    created_at: rp1::datetime::OffsetDateTime,
    #[generated]
    updated_at: rp1::datetime::OffsetDateTime,
}

#[rocket::launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/users", User::get_routes())
        .attach(Db::fairing())
}
```

## Project setup
To get started, you will need to add a few dependencies to your `Cargo.toml`.

```toml
[dependencies]
rp1 = "0.3"
diesel = { version = "1.4", features = ["postgres", "r2d2"] }
diesel_migrations = "1.4"
rocket = "0.5.0-rc.1"
rocket_sync_db_pools = { version = "0.1.0-rc.1", features = ["diesel_postgres_pool"] }
serde = "1.0"
serde_json = "1.0"
validator = "0.14"
```

Next, make sure you have installed the diesel cli. To do this, you can run

```bash
cargo install diesel_cli --no-default-features --features postgres
```

If you need to have support for all database types supported by diesel you can
run `cargo install diesel_cli` instead. Do make sure you installed the relevant
libraries for the databases you intend to use (e.g. for debian based OSes make
sure you installed `libpq-dev`). You should now also start a postgresql server.
For the example in this repository we have a docker-compose.yml file that you
can use to start a simple PostgreSQL development server using docker-compose.

Next, create a file `.env` and add the `DATABASE_URL` environment variable. If
you used the `docker-compose.yml` file then it should read:

```bash
DATABASE_URL=postgres://crud@127.0.0.1:5432/crud
```

Now we are ready to run `diesel setup` which will create an initial migration
and get us ready to define our database schema. Start by adding your initial
migration using `diesel migration generate <name>`. After you completed your
migration run `diesel migration run` and a `schema.rs` file should appear.

Next, update your `main.rs` file to read:

```rust
#[macro_use]
extern crate diesel;

mod schema;

use rocket_sync_db_pools::database;

#[database("diesel")]
struct Db(diesel::PgConnection);

#[rocket::launch]
fn rocket() -> _ {
    rocket::build()
        .attach(Db::fairing())
}
```

Note the `#[macro_use] extern crate diesel;` and `mod schema` specifically for
Diesel, and the `struct Db` and `fn rocket` which are used by Rocket to
communicate with Diesel. Finally, we need to configure rocket to use the same
database as the diesel-cli. To do this, create a file `Rocket.toml` and place
the following configuration in it (replacing the database URL with your own):

```toml
[global.databases]
diesel = { url = "postgres://crud@127.0.0.1:5432/crud" }
```

Now, you should be able to run `cargo run` and your project should start! You
are finally ready for your first RP1 struct. To get started with your first
RP1 struct, you should take a look at the documentation for the [crud] macro.