From 60988cff249a610a1d44627bb9b8aaeabcfc9a86 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Tue, 3 Jan 2023 16:11:43 +0100 Subject: [PATCH] Make Rust models for database schema --- Cargo.toml | 7 ++- diesel.toml | 2 +- .../2023-01-03-134426_create_language/up.sql | 4 +- src/db/mod.rs | 2 + src/db/models/languages.rs | 53 ++++++++++++++++++ src/db/models/mod.rs | 3 + src/db/models/users.rs | 16 ++++++ src/db/models/words.rs | 56 +++++++++++++++++++ src/{ => db}/schema.rs | 4 +- src/main.rs | 2 + 10 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 src/db/mod.rs create mode 100644 src/db/models/languages.rs create mode 100644 src/db/models/mod.rs create mode 100644 src/db/models/users.rs create mode 100644 src/db/models/words.rs rename src/{ => db}/schema.rs (97%) diff --git a/Cargo.toml b/Cargo.toml index cc42944..445e5a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,5 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -diesel = { version = "2.0", features = ["postgres"] } -dotenvy = "0.15" +diesel = { version = "2.0", features = ["postgres", "chrono"] } +diesel-derive-enum = { version = "2.0.0-rc.0", features = ["postgres"] } +chrono = "0.4.23" + +dotenvy = "0.15" \ No newline at end of file diff --git a/diesel.toml b/diesel.toml index 35a12ff..88db6ba 100644 --- a/diesel.toml +++ b/diesel.toml @@ -2,7 +2,7 @@ # see https://diesel.rs/guides/configuring-diesel-cli [print_schema] -file = "src/schema.rs" +file = "src/db/schema.rs" [migrations_directory] dir = "migrations" diff --git a/migrations/2023-01-03-134426_create_language/up.sql b/migrations/2023-01-03-134426_create_language/up.sql index 045dc31..14c34b1 100644 --- a/migrations/2023-01-03-134426_create_language/up.sql +++ b/migrations/2023-01-03-134426_create_language/up.sql @@ -6,11 +6,11 @@ CREATE TYPE AgentLanguageRelation as ENUM ('publisher', 'author'); CREATE TABLE Languages ( name VARCHAR(255) PRIMARY KEY, native VARCHAR(255), - relese Release NOT NULL, + release Release NOT NULL, targetLanguage TEXT[] NOT NULL, genre DictGenre[] NOT NULL, abstract TEXT, - created TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, description TEXT, rights TEXT, license TEXT, diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..d5cbad7 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,2 @@ +pub mod models; +pub mod schema; diff --git a/src/db/models/languages.rs b/src/db/models/languages.rs new file mode 100644 index 0000000..1810a7e --- /dev/null +++ b/src/db/models/languages.rs @@ -0,0 +1,53 @@ +use diesel::prelude::*; +use super::super::schema::{languages, langandagents}; + +#[derive(diesel_derive_enum::DbEnum, Debug, Clone, PartialEq, Eq)] +#[DieselTypePath = "crate::db::schema::sql_types::Release"] +pub enum Release { + Public, + NonCommercial, + Research, + Private +} + +#[derive(diesel_derive_enum::DbEnum, Debug, Clone, PartialEq, Eq)] +#[DieselTypePath = "crate::db::schema::sql_types::Dictgenre"] +pub enum DictGenre { + General, + Learning, + Etymology, + Specialized, + Historical, + Orthography, + Terminology +} + +#[derive(diesel_derive_enum::DbEnum, Debug, Clone, PartialEq, Eq)] +#[DieselTypePath = "crate::db::schema::sql_types::Agentlanguagerelation"] +pub enum AgentLanguageRelation { + Publisher, + Author +} + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +pub struct Language { + release: Release, + created: chrono::NaiveDateTime, + name: String, + owner: String, + targetlanguage: Vec, + genre: Vec, + native: Option, + abstract_: Option, + description: Option, + rights: Option, + license: Option, +} + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +#[diesel(table_name = langandagents)] +pub struct LangAndAgent { + id: i32, + agent: String, + language: String, +} diff --git a/src/db/models/mod.rs b/src/db/models/mod.rs new file mode 100644 index 0000000..44b7e11 --- /dev/null +++ b/src/db/models/mod.rs @@ -0,0 +1,3 @@ +pub mod users; +pub mod languages; +pub mod words; diff --git a/src/db/models/users.rs b/src/db/models/users.rs new file mode 100644 index 0000000..7a9d024 --- /dev/null +++ b/src/db/models/users.rs @@ -0,0 +1,16 @@ +use diesel::prelude::*; +use super::super::schema::{userfollows, users}; + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +pub struct User { + pub id: String, + pub username: String, +} + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +#[diesel(table_name = userfollows)] +pub struct UserFollow { + pub id: i32, + pub follower: String, + pub following: String, +} diff --git a/src/db/models/words.rs b/src/db/models/words.rs new file mode 100644 index 0000000..8dda43a --- /dev/null +++ b/src/db/models/words.rs @@ -0,0 +1,56 @@ +use diesel::prelude::*; +use super::super::schema::{wordrelation, words}; + +#[derive(diesel_derive_enum::DbEnum, Debug, Clone, PartialEq, Eq)] +#[DieselTypePath = "crate::db::schema::sql_types::Wordrelationship"] +pub enum WordRelationship { + Definition, + Related +} + +#[derive(diesel_derive_enum::DbEnum, Debug, Clone, PartialEq, Eq)] +#[DieselTypePath = "crate::db::schema::sql_types::Partofspeech"] +pub enum PartOfSpeech { + Adjective, + Adposition, + Adverb, + Auxilliary, + CoordConj, + Determiner, + Interjection, + Noun, + Numeral, + Particle, + Pronoun, + ProperNoun, + Punctuation, + SubjConj, + Symbol, + Verb, + Other +} + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +struct Word { + norm: String, + native: Option, + lemma: Option, + language: String, + partofspeech: PartOfSpeech, + audio: Option, + video: Option, + image: Option, + description: Option, + etymology: Option, + lusage: Option, + morphology: Option, +} + +#[derive(Queryable, Insertable, Debug, Clone, PartialEq, Eq)] +#[diesel(table_name = wordrelation)] +struct WordRelation { + id: i32, + wordsource: String, + wordtarget: String, + relationship: WordRelationship, +} diff --git a/src/schema.rs b/src/db/schema.rs similarity index 97% rename from src/schema.rs rename to src/db/schema.rs index 592fb7d..8ca71e4 100644 --- a/src/schema.rs +++ b/src/db/schema.rs @@ -42,12 +42,12 @@ diesel::table! { languages (name) { name -> Varchar, native -> Nullable, - relese -> Release, + release -> Release, targetlanguage -> Array>, genre -> Array>, #[sql_name = "abstract"] abstract_ -> Nullable, - created -> Nullable, + created -> Timestamp, description -> Nullable, rights -> Nullable, license -> Nullable, diff --git a/src/main.rs b/src/main.rs index e7a11a9..8ef45e8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +mod db; + fn main() { println!("Hello, world!"); }