Initial scaffold: Rust server workspace (sb-api, sb-core, sb-db, sb-auth, sb-shared) + sb-common dependency + systemd

This commit is contained in:
Jan-Peter von Hunnius 2026-08-02 12:48:08 +02:00
commit 7a75a523f0
39 changed files with 183 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
target/
Cargo.lock
.env

12
Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[workspace]
resolver = "2"
members = [
"crates/sb-api",
"crates/sb-core",
"crates/sb-db",
"crates/sb-auth",
"crates/sb-shared",
]
[patch.crates-io]
sb-common = { path = "/home/jan/Development/skara-brae/skara-brae-common/rust" }

19
crates/sb-api/Cargo.toml Normal file
View file

@ -0,0 +1,19 @@
[package]
name = "sb-api"
version = "0.1.0"
edition = "2024"
[dependencies]
axum = { version = "0.8", features = ["ws", "macros"] }
tokio = { version = "1", features = ["full"] }
tower = "0.5"
tower-http = { version = "0.6", features = ["cors", "trace", "compression-gzip"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
sb-core = { path = "../sb-core" }
sb-db = { path = "../sb-db" }
sb-auth = { path = "../sb-auth" }
sb-shared = { path = "../sb-shared" }
sb-common = { path = "/home/jan/Development/skara-brae/skara-brae-common/rust" }

34
crates/sb-api/src/main.rs Normal file
View file

@ -0,0 +1,34 @@
#![allow(dead_code)]
use axum::routing::get;
use axum::Router;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
pub mod routes;
pub mod ws;
#[tokio::main]
async fn main() {
tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer().pretty())
.with(tracing_subscriber::EnvFilter::new(
std::env::var("RUST_LOG").unwrap_or_else(|_| "info".into()),
))
.init();
let app = Router::new()
.route("/health", get(health))
.merge(routes::build());
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080")
.await
.expect("failed to bind");
tracing::info!("listening on {:?}", listener.local_addr());
axum::serve(listener, app).await.expect("server error");
}
async fn health() -> &'static str {
"ok"
}

View file

View file

@ -0,0 +1,2 @@
pub mod auth;
pub mod rate_limit;

View file

@ -0,0 +1,5 @@
use axum::{routing::get, Router};
pub fn build() -> Router {
Router::new().route("/", get(|| async { "skara-brae api" }))
}

View file

View file

View file

@ -0,0 +1,2 @@
pub mod handler;
pub mod channels;

11
crates/sb-auth/Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "sb-auth"
version = "0.1.0"
edition = "2024"
[dependencies]
jsonwebtoken = "9"
argon2 = "0.5"
serde = { version = "1", features = ["derive"] }
chrono = { version = "0.4", features = ["serde"] }
sb-shared = { path = "../sb-shared" }

View file

View file

View file

@ -0,0 +1,3 @@
pub mod jwt;
pub mod hash;
pub mod session;

View file

13
crates/sb-core/Cargo.toml Normal file
View file

@ -0,0 +1,13 @@
[package]
name = "sb-core"
version = "0.1.0"
edition = "2024"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
rand = "0.9"
chrono = { version = "0.4", features = ["serde"] }
thiserror = "2"
sb-shared = { path = "../sb-shared" }
sb-common = { path = "/home/jan/Development/skara-brae/skara-brae-common/rust" }

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1,13 @@
pub mod mod;
use sb_common::PROJECT_NAME;
const WEAPONS: &str = include_str!("../../../../skara-brae-common/data/items/weapons.json");
pub fn game_name() -> &'static str {
PROJECT_NAME
}
pub fn load_weapons() -> Vec<serde_json::Value> {
serde_json::from_str(WEAPONS).expect("failed to parse weapons data")
}

14
crates/sb-core/src/lib.rs Normal file
View file

@ -0,0 +1,14 @@
#![allow(dead_code)]
pub mod character;
pub mod combat;
pub mod adventure;
pub mod economy;
pub mod guild;
pub mod crafting;
pub mod pets;
pub mod blessings;
pub mod workers;
pub mod slayer;
pub mod world;
pub mod rules;

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

9
crates/sb-db/Cargo.toml Normal file
View file

@ -0,0 +1,9 @@
[package]
name = "sb-db"
version = "0.1.0"
edition = "2024"
[dependencies]
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "chrono", "uuid", "migrate"] }
serde = { version = "1", features = ["derive"] }
sb-shared = { path = "../sb-shared" }

4
crates/sb-db/src/lib.rs Normal file
View file

@ -0,0 +1,4 @@
#![allow(dead_code)]
pub mod models;
pub mod queries;

View file

View file

View file

View file

@ -0,0 +1,9 @@
[package]
name = "sb-shared"
version = "0.1.0"
edition = "2024"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2"

View file

@ -0,0 +1,15 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppError {
pub code: String,
pub message: String,
}
impl std::fmt::Display for AppError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}: {}", self.code, self.message)
}
}
impl std::error::Error for AppError {}

View file

@ -0,0 +1,3 @@
pub mod errors;
pub use errors::AppError;