From 28fc5a7f9de3cc27e394efdd72e27972a91159d0 Mon Sep 17 00:00:00 2001 From: Bispribbit Date: Sat, 1 Nov 2025 12:12:33 -0400 Subject: [PATCH 1/4] Downgrade to a working version --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0228719..7e16094 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -22,7 +22,7 @@ jobs: components: rustfmt, clippy - name: Rust Cache - uses: Swatinem/rust-cache@2.8.1 + uses: Swatinem/rust-cache@2.8.0 - name: Cargo Fmt run: cargo fmt --all -- --check From c32fe972709a71560b89988497404dad0813541e Mon Sep 17 00:00:00 2001 From: Bispribbit Date: Sat, 1 Nov 2025 12:13:41 -0400 Subject: [PATCH 2/4] Again --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 7e16094..e7f2dc3 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -22,7 +22,7 @@ jobs: components: rustfmt, clippy - name: Rust Cache - uses: Swatinem/rust-cache@2.8.0 + uses: Swatinem/rust-cache@v2 - name: Cargo Fmt run: cargo fmt --all -- --check From a87e9c4462fee92a0f6e60b4b0229ef837c21e77 Mon Sep 17 00:00:00 2001 From: Bispribbit Date: Sat, 1 Nov 2025 12:47:00 -0400 Subject: [PATCH 3/4] Add github actions extension --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6add2b3..65a175d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,9 +6,10 @@ "customizations": { "vscode": { "extensions": [ + "fill-labs.dependi", + "github.vscode-github-actions", "rust-lang.rust-analyzer", "tamasfe.even-better-toml", - "fill-labs.dependi", "vadimcn.vscode-lldb" ], "settings": { From 917235a9b8d5f1fa7a366f422cd0790d6dacd331 Mon Sep 17 00:00:00 2001 From: Bispribbit Date: Sat, 20 Dec 2025 11:03:19 -0500 Subject: [PATCH 4/4] Improved the rust-template to integrate dev-container with a postgresql integration example --- .devcontainer/Dockerfile | 9 ++--- .devcontainer/devcontainer.json | 10 +++--- .devcontainer/docker-compose.yml | 36 +++++++++++++++++++ Cargo.toml | 6 ++-- crates/{project_lib => database}/Cargo.toml | 5 ++- .../migrations/20241220000000_init.sql | 10 ++++++ crates/database/src/lib.rs | 23 ++++++++++++ crates/project_exe/Cargo.toml | 6 ++-- crates/project_exe/src/main.rs | 25 +++++++++---- crates/project_lib/src/lib.rs | 13 ------- rust-toolchain.toml | 2 +- 11 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 .devcontainer/docker-compose.yml rename crates/{project_lib => database}/Cargo.toml (65%) create mode 100644 crates/database/migrations/20241220000000_init.sql create mode 100644 crates/database/src/lib.rs delete mode 100644 crates/project_lib/src/lib.rs diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 76ba3cd..752ccf1 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.91.0-trixie +FROM rust:1.92.0-trixie # Install additional tools for Rust development RUN apt-get update && apt-get install -y \ @@ -12,6 +12,8 @@ RUN apt-get update && apt-get install -y \ wget \ pkg-config \ libssl-dev \ + libpq-dev \ + postgresql-client \ && rm -rf /var/lib/apt/lists/* # Install rust components @@ -20,12 +22,11 @@ RUN rustup component add rustfmt clippy rust-src llvm-tools # Install cargo-binstall RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash -# Install cargo-make using cargo-binstall -RUN cargo binstall cargo-make cargo-edit -y +# Install cargo tools using cargo-binstall +RUN cargo binstall cargo-make cargo-edit sqlx-cli -y # Set the working directory WORKDIR /workspace # Keep container running CMD ["/bin/bash"] - diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 65a175d..27e53f1 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,8 +1,8 @@ { "name": "Rust Development", - "build": { - "dockerfile": "Dockerfile" - }, + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspace", "customizations": { "vscode": { "extensions": [ @@ -31,7 +31,5 @@ } }, "remoteUser": "root", - "mounts": [ - "source=${localEnv:HOME}${localEnv:USERPROFILE}/.cargo/registry,target=/usr/local/cargo/registry,type=bind,consistency=cached" - ] + "postStartCommand": "cd /workspace/crates/database && sqlx migrate run" } \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..caaaebf --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,36 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + volumes: + - ..:/workspace:cached + - cargo-registry:/usr/local/cargo/registry + environment: + - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres + depends_on: + db: + condition: service_healthy + command: sleep infinity + + db: + image: postgres:17 + restart: unless-stopped + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + volumes: + - postgres-data:/var/lib/postgresql/data + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + +volumes: + cargo-registry: + postgres-data: + diff --git a/Cargo.toml b/Cargo.toml index 1f7e4c6..6b3b2e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,12 @@ license = "MIT OR Apache-2.0" [workspace.dependencies] # Internal workspace dependencies -project_lib = { path = "crates/project_lib" } +database = { path = "crates/database" } # External workspace dependencies -parking_lot = { version = "0.12.5", default-features = false } +anyhow = { version = "1.0.100" } +sqlx = { version = "0.8.6", features = ["runtime-tokio", "tls-rustls", "postgres", "migrate"] } +tokio = { version = "1.48.0", features = ["rt-multi-thread", "macros"] } [workspace.lints.rust] future_incompatible = { level = "warn", priority = -1 } diff --git a/crates/project_lib/Cargo.toml b/crates/database/Cargo.toml similarity index 65% rename from crates/project_lib/Cargo.toml rename to crates/database/Cargo.toml index bd5d460..0ef9898 100644 --- a/crates/project_lib/Cargo.toml +++ b/crates/database/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "project_lib" +name = "database" version = "0.1.0" edition.workspace = true license.workspace = true @@ -8,3 +8,6 @@ license.workspace = true workspace = true [dependencies] +sqlx.workspace = true +tokio.workspace = true + diff --git a/crates/database/migrations/20241220000000_init.sql b/crates/database/migrations/20241220000000_init.sql new file mode 100644 index 0000000..9efb606 --- /dev/null +++ b/crates/database/migrations/20241220000000_init.sql @@ -0,0 +1,10 @@ +-- Initial migration +-- Add your initial schema here + +CREATE TABLE IF NOT EXISTS example ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + diff --git a/crates/database/src/lib.rs b/crates/database/src/lib.rs new file mode 100644 index 0000000..2f223dc --- /dev/null +++ b/crates/database/src/lib.rs @@ -0,0 +1,23 @@ +use sqlx::PgPool; +use sqlx::postgres::PgPoolOptions; + +/// Creates a connection pool to the `PostgreSQL` database. +/// +/// # Errors +/// +/// Returns an error if the connection to the database fails. +pub async fn create_pool(database_url: &str) -> Result { + PgPoolOptions::new() + .max_connections(5) + .connect(database_url) + .await +} + +/// Runs all pending migrations. +/// +/// # Errors +/// +/// Returns an error if running migrations fails. +pub async fn run_migrations(pool: &PgPool) -> Result<(), sqlx::migrate::MigrateError> { + sqlx::migrate!("./migrations").run(pool).await +} diff --git a/crates/project_exe/Cargo.toml b/crates/project_exe/Cargo.toml index 25ebd44..e07d2a6 100644 --- a/crates/project_exe/Cargo.toml +++ b/crates/project_exe/Cargo.toml @@ -9,7 +9,9 @@ workspace = true [dependencies] # Internal dependencies -project_lib.workspace = true +database.workspace = true # External dependencies -parking_lot.workspace = true +anyhow.workspace = true +sqlx.workspace = true +tokio.workspace = true diff --git a/crates/project_exe/src/main.rs b/crates/project_exe/src/main.rs index 9fd34a3..e4a46a6 100644 --- a/crates/project_exe/src/main.rs +++ b/crates/project_exe/src/main.rs @@ -1,10 +1,21 @@ -use parking_lot::Mutex; -use project_lib::add; +use database::{create_pool, run_migrations}; +use sqlx::query; -#[derive(Default, Copy, Clone)] -struct Abc; +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let database_url = std::env::var("DATABASE_URL")?; + let pool = create_pool(&database_url).await?; + run_migrations(&pool).await?; -fn main() { - Mutex::new(Abc); - println!("Hello, world! {}", add(2, 4)); + query!("INSERT INTO example (name) VALUES ($1)", "Hello, world!") + .execute(&pool) + .await?; + + let results = query!("SELECT name FROM example").fetch_all(&pool).await?; + + for row in results { + println!("Result: {:?}", row.name); + } + + Ok(()) } diff --git a/crates/project_lib/src/lib.rs b/crates/project_lib/src/lib.rs deleted file mode 100644 index 0c14516..0000000 --- a/crates/project_lib/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -pub const fn add(value_a: i64, value_b: i64) -> i64 { - value_a + value_b -} - -#[cfg(test)] -mod test { - use crate::add; - - #[test] - fn test_add() { - assert_eq!(add(1, 2), 3); - } -} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index ddcd699..1791ba9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.91.0" +channel = "1.92.0" profile = "default" components = ["llvm-tools"]