#!/bin/bash set -euo pipefail tmp="$(mktemp -d)" trap 'rm -rf -- "$tmp"' EXIT # deps hash sqlite3 diesel diesel_ext rustfmt gen_route() { local upper="$1" local lower="$(sed 's/[[:upper:]]/_&/g;s/^_//' <<<"$upper" | tr '[:upper:]' '[:lower:]')" cat <) -> Result>> { let data = input.clone(); db.run(move |conn| { diesel::insert_into(${lower}s::table) .values(&data) .execute(conn) }) .await?; Ok(Created::new("/").body(input)) } #[get("/$lower/")] async fn get_$lower(db: Db, id: i64) -> Option> { db.run(move |conn| ${lower}s::table.filter(${lower}s::id.eq(id)).first(conn)) .await .map(InOut) .ok() } EOF } gen_routes() { local db="$1" cat <> = std::result::Result; EOF grep 'pub struct' "$tmp"/model.rs | grep -v 'User' | while read -r _ _ name _; do gen_route "$name" done cat <, path: &str) -> Rocket { rocket.attach(Db::fairing()).mount(path, routes![ EOF grep 'pub struct' "$tmp"/model.rs | grep -v 'User' | while read -r _ _ name _; do local lower="$(sed 's/[[:upper:]]/_&/g;s/^_//' <<<"$name" | tr '[:upper:]' '[:lower:]')" printf ' %s,\n' "put_$lower" printf ' %s,\n' "get_$lower" done cat < Timestamp/created_at -> Nullable/g' |\ sed 's/id -> BigInt/id -> Nullable/g' |\ sed 's/meta -> Text/meta -> Nullable/g' \ > "$tmp"/schema.rs diesel_ext -s "$tmp"/schema.rs -m \ -d 'Serialize, Deserialize, Queryable, Insertable, Clone, Debug' \ -I 'rocket::serde::{Serialize, Deserialize}' |\ awk '/#\[derive/{print;print "#[serde(crate = \"rocket::serde\")]";next}1' \ > "$tmp"/model.rs gen_routes "$db" | cat "$tmp"/schema.rs "$tmp"/model.rs - |\ grep -v '^// Generated by diesel_ext' |\ grep -v '^#!' > src/"$db".rs rustfmt --edition 2021 src/"$db".rs done