From cc2717bf9c8a8c15a0f2d72e87607e96928f71d8 Mon Sep 17 00:00:00 2001 From: glendc Date: Thu, 19 Oct 2023 00:28:49 +0200 Subject: [PATCH] update codebase and make deploy to shuttle manual: --- .github/workflows/Shuttle.yml | 15 ----- Cargo.lock | 24 ++++---- Cargo.toml | 2 +- justfile | 47 ++++++++++++---- nes-studio-app/Cargo.toml | 46 +++++++++++++++ {nes-studio => nes-studio-app}/assets/sw.js | 0 .../dist/index.html | 6 +- .../dist/nes-studio-app-f98dff9e3f5d751c.js | 2 +- .../nes-studio-app-f98dff9e3f5d751c_bg.wasm | Bin 9055341 -> 9055481 bytes {nes-studio => nes-studio-app}/dist/sw.js | 0 {nes-studio => nes-studio-app}/index.html | 0 {nes-studio => nes-studio-app}/src/app.rs | 0 {nes-studio => nes-studio-app}/src/lib.rs | 0 nes-studio-app/src/main.rs | 39 +++++++++++++ nes-studio-website/Cargo.toml | 12 ---- nes-studio-website/src/main.rs | 22 -------- nes-studio/Cargo.toml | 46 ++------------- nes-studio/src/main.rs | 53 ++++++------------ 18 files changed, 162 insertions(+), 152 deletions(-) delete mode 100644 .github/workflows/Shuttle.yml create mode 100644 nes-studio-app/Cargo.toml rename {nes-studio => nes-studio-app}/assets/sw.js (100%) rename {nes-studio => nes-studio-app}/dist/index.html (92%) rename nes-studio/dist/nes-studio-53894f64447dc15a.js => nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c.js (99%) rename nes-studio/dist/nes-studio-53894f64447dc15a_bg.wasm => nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c_bg.wasm (87%) rename {nes-studio => nes-studio-app}/dist/sw.js (100%) rename {nes-studio => nes-studio-app}/index.html (100%) rename {nes-studio => nes-studio-app}/src/app.rs (100%) rename {nes-studio => nes-studio-app}/src/lib.rs (100%) create mode 100644 nes-studio-app/src/main.rs delete mode 100644 nes-studio-website/Cargo.toml delete mode 100644 nes-studio-website/src/main.rs diff --git a/.github/workflows/Shuttle.yml b/.github/workflows/Shuttle.yml deleted file mode 100644 index 6a172a9..0000000 --- a/.github/workflows/Shuttle.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Shuttle Deploy - -on: - push: - branches: - - "main" - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: shuttle-hq/deploy-action@main - with: - deploy-key: ${{ secrets.SHUTTLE_DEPLOY_KEY }} diff --git a/Cargo.lock b/Cargo.lock index 203a677..347d8bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2193,18 +2193,6 @@ dependencies = [ [[package]] name = "nes-studio" version = "0.1.0" -dependencies = [ - "eframe", - "egui", - "env_logger", - "log", - "serde", - "wasm-bindgen-futures", -] - -[[package]] -name = "nes-studio-website" -version = "0.1.0" dependencies = [ "axum", "shuttle-axum", @@ -2214,6 +2202,18 @@ dependencies = [ "tower-http", ] +[[package]] +name = "nes-studio-app" +version = "0.1.0" +dependencies = [ + "eframe", + "egui", + "env_logger", + "log", + "serde", + "wasm-bindgen-futures", +] + [[package]] name = "nix" version = "0.24.3" diff --git a/Cargo.toml b/Cargo.toml index be9a0c6..4aec2bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] members = [ + "nes-studio-app", "nes-studio", - "nes-studio-website", ] resolver = "2" diff --git a/justfile b/justfile index 9ec418c..fb550ba 100644 --- a/justfile +++ b/justfile @@ -1,17 +1,42 @@ -run: - cargo shuttle run - -watch: - cargo watch -x "shuttle run" -i Cargo.lock - -deploy: - cargo shuttle deploy - -trunk: +check: cargo check --workspace --all-targets + +check-wasm32: cargo check --workspace --all-features --lib --target wasm32-unknown-unknown + +check-fmt: cargo fmt --all -- --check + +clippy: cargo clippy --workspace --all-targets --all-features -- -D warnings -W clippy::all + +test: cargo test --workspace --all-targets --all-features + +test-docs: cargo test --workspace --doc - cd nes-studio && trunk build + +trunk-build: + cd nes-studio-app && trunk build + +trunk-watch: + cd nes-studio-app && trunk watch + +qa: check check-wasm32 check-fmt clippy test test-docs trunk-build + +fmt: + cargo fmt --all + +clippy-fix: + cargo clippy --fix --workspace --all-targets --all-features --allow-dirty + +fix: fmt clippy-fix + +git-push: qa + git push + +shuttle-deploy: qa + cargo shuttle deploy + +shuttle-watch: + cargo watch -x 'shuttle run' -i 'nes-studio-app,Cargo.lock' diff --git a/nes-studio-app/Cargo.toml b/nes-studio-app/Cargo.toml new file mode 100644 index 0000000..2e1cce2 --- /dev/null +++ b/nes-studio-app/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "nes-studio-app" +version = "0.1.0" +authors = ["Glen Henri J. De Cauwsemaecker "] +edition = "2021" + + +[dependencies] +egui = "0.23.0" +eframe = { version = "0.23.0", default-features = false, features = [ + "accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies. + "default_fonts", # Embed the default egui fonts. + "wgpu", # Use the wgpu rendering backend. + "persistence", # Enable restoring app state when restarting the app. +] } +log = "0.4" + +# You only need serde if you want app persistence: +serde = { version = "1", features = ["derive"] } + +# native: +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +env_logger = "0.10" + +# web: +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm-bindgen-futures = "0.4" + + +[profile.release] +opt-level = 2 # fast and small wasm + +# Optimize all dependencies even in debug builds: +[profile.dev.package."*"] +opt-level = 2 + + +[patch.crates-io] + +# If you want to use the bleeding edge version of egui and eframe: +# egui = { git = "https://github.com/emilk/egui", branch = "master" } +# eframe = { git = "https://github.com/emilk/egui", branch = "master" } + +# If you fork https://github.com/emilk/egui you can test with: +# egui = { path = "../egui/crates/egui" } +# eframe = { path = "../egui/crates/eframe" } diff --git a/nes-studio/assets/sw.js b/nes-studio-app/assets/sw.js similarity index 100% rename from nes-studio/assets/sw.js rename to nes-studio-app/assets/sw.js diff --git a/nes-studio/dist/index.html b/nes-studio-app/dist/index.html similarity index 92% rename from nes-studio/dist/index.html rename to nes-studio-app/dist/index.html index c0b9679..923ab3e 100644 --- a/nes-studio/dist/index.html +++ b/nes-studio-app/dist/index.html @@ -8,7 +8,7 @@ NES Studio - + @@ -106,8 +106,8 @@ - - + + diff --git a/nes-studio/dist/nes-studio-53894f64447dc15a.js b/nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c.js similarity index 99% rename from nes-studio/dist/nes-studio-53894f64447dc15a.js rename to nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c.js index d35ca9a..7c5ad81 100644 --- a/nes-studio/dist/nes-studio-53894f64447dc15a.js +++ b/nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c.js @@ -1486,7 +1486,7 @@ async function __wbg_init(input) { if (wasm !== undefined) return wasm; if (typeof input === 'undefined') { - input = new URL('nes-studio-53894f64447dc15a_bg.wasm', import.meta.url); + input = new URL('nes-studio-app-f98dff9e3f5d751c_bg.wasm', import.meta.url); } const imports = __wbg_get_imports(); diff --git a/nes-studio/dist/nes-studio-53894f64447dc15a_bg.wasm b/nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c_bg.wasm similarity index 87% rename from nes-studio/dist/nes-studio-53894f64447dc15a_bg.wasm rename to nes-studio-app/dist/nes-studio-app-f98dff9e3f5d751c_bg.wasm index e9e4c15e1a4a9cdb8f58c1bb41cf066d8a1703da..5be36cd1b73cd1ac86799881f900cbd8459c66c3 100644 GIT binary patch delta 23273 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 WEA`K=e11S{SW}HHu&w?v=KldZM4ll4 delta 23039 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 C{5c)~ diff --git a/nes-studio/dist/sw.js b/nes-studio-app/dist/sw.js similarity index 100% rename from nes-studio/dist/sw.js rename to nes-studio-app/dist/sw.js diff --git a/nes-studio/index.html b/nes-studio-app/index.html similarity index 100% rename from nes-studio/index.html rename to nes-studio-app/index.html diff --git a/nes-studio/src/app.rs b/nes-studio-app/src/app.rs similarity index 100% rename from nes-studio/src/app.rs rename to nes-studio-app/src/app.rs diff --git a/nes-studio/src/lib.rs b/nes-studio-app/src/lib.rs similarity index 100% rename from nes-studio/src/lib.rs rename to nes-studio-app/src/lib.rs diff --git a/nes-studio-app/src/main.rs b/nes-studio-app/src/main.rs new file mode 100644 index 0000000..4e782ef --- /dev/null +++ b/nes-studio-app/src/main.rs @@ -0,0 +1,39 @@ +#![warn(clippy::all, rust_2018_idioms)] +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release + +// When compiling natively: +#[cfg(not(target_arch = "wasm32"))] +fn main() -> eframe::Result<()> { + env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). + + let native_options = eframe::NativeOptions { + initial_window_size: Some([400.0, 300.0].into()), + min_window_size: Some([300.0, 220.0].into()), + ..Default::default() + }; + eframe::run_native( + "eframe template", + native_options, + Box::new(|cc| Box::new(nes_studio_app::TemplateApp::new(cc))), + ) +} + +// When compiling to web using trunk: +#[cfg(target_arch = "wasm32")] +fn main() { + // Redirect `log` message to `console.log` and friends: + eframe::WebLogger::init(log::LevelFilter::Debug).ok(); + + let web_options = eframe::WebOptions::default(); + + wasm_bindgen_futures::spawn_local(async { + eframe::WebRunner::new() + .start( + "the_canvas_id", // hardcode it + web_options, + Box::new(|cc| Box::new(nes_studio_app::TemplateApp::new(cc))), + ) + .await + .expect("failed to start eframe"); + }); +} diff --git a/nes-studio-website/Cargo.toml b/nes-studio-website/Cargo.toml deleted file mode 100644 index de8d095..0000000 --- a/nes-studio-website/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "nes-studio-website" -version = "0.1.0" -edition = "2021" - -[dependencies] -axum = "0.6" -shuttle-axum = "0.29" -shuttle-runtime = "0.29" -tokio = "1.28" -tower = { version = "0.4", features = ["tracing"] } -tower-http = { version = "0.4", features = ["fs", "trace", "compression-full", "normalize-path"] } \ No newline at end of file diff --git a/nes-studio-website/src/main.rs b/nes-studio-website/src/main.rs deleted file mode 100644 index f5fe89d..0000000 --- a/nes-studio-website/src/main.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::path::PathBuf; - -use axum::Router; -use tower::ServiceBuilder; -use tower_http::{ - compression::CompressionLayer, normalize_path::NormalizePathLayer, services::ServeDir, - trace::TraceLayer, -}; - -#[shuttle_runtime::main] -async fn main() -> shuttle_axum::ShuttleAxum { - let router = Router::new() - .nest_service("/", ServeDir::new(PathBuf::from("nes-studio/dist"))) - .layer( - ServiceBuilder::new() - .layer(TraceLayer::new_for_http()) - .layer(CompressionLayer::new()) - .layer(NormalizePathLayer::trim_trailing_slash()), - ); - - Ok(router.into()) -} diff --git a/nes-studio/Cargo.toml b/nes-studio/Cargo.toml index 38b3d08..29e82fd 100644 --- a/nes-studio/Cargo.toml +++ b/nes-studio/Cargo.toml @@ -1,46 +1,12 @@ [package] name = "nes-studio" version = "0.1.0" -authors = ["Glen Henri J. De Cauwsemaecker "] edition = "2021" - [dependencies] -egui = "0.23.0" -eframe = { version = "0.23.0", default-features = false, features = [ - "accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies. - "default_fonts", # Embed the default egui fonts. - "wgpu", # Use the wgpu rendering backend. - "persistence", # Enable restoring app state when restarting the app. -] } -log = "0.4" - -# You only need serde if you want app persistence: -serde = { version = "1", features = ["derive"] } - -# native: -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -env_logger = "0.10" - -# web: -[target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen-futures = "0.4" - - -[profile.release] -opt-level = 2 # fast and small wasm - -# Optimize all dependencies even in debug builds: -[profile.dev.package."*"] -opt-level = 2 - - -[patch.crates-io] - -# If you want to use the bleeding edge version of egui and eframe: -# egui = { git = "https://github.com/emilk/egui", branch = "master" } -# eframe = { git = "https://github.com/emilk/egui", branch = "master" } - -# If you fork https://github.com/emilk/egui you can test with: -# egui = { path = "../egui/crates/egui" } -# eframe = { path = "../egui/crates/eframe" } +axum = "0.6" +shuttle-axum = "0.29" +shuttle-runtime = "0.29" +tokio = "1.28" +tower = { version = "0.4", features = ["tracing"] } +tower-http = { version = "0.4", features = ["fs", "trace", "compression-full", "normalize-path"] } \ No newline at end of file diff --git a/nes-studio/src/main.rs b/nes-studio/src/main.rs index 08f3873..3b34b0d 100644 --- a/nes-studio/src/main.rs +++ b/nes-studio/src/main.rs @@ -1,39 +1,22 @@ -#![warn(clippy::all, rust_2018_idioms)] -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release +use std::path::PathBuf; -// When compiling natively: -#[cfg(not(target_arch = "wasm32"))] -fn main() -> eframe::Result<()> { - env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). +use axum::Router; +use tower::ServiceBuilder; +use tower_http::{ + compression::CompressionLayer, normalize_path::NormalizePathLayer, services::ServeDir, + trace::TraceLayer, +}; - let native_options = eframe::NativeOptions { - initial_window_size: Some([400.0, 300.0].into()), - min_window_size: Some([300.0, 220.0].into()), - ..Default::default() - }; - eframe::run_native( - "eframe template", - native_options, - Box::new(|cc| Box::new(nes_studio::TemplateApp::new(cc))), - ) -} - -// When compiling to web using trunk: -#[cfg(target_arch = "wasm32")] -fn main() { - // Redirect `log` message to `console.log` and friends: - eframe::WebLogger::init(log::LevelFilter::Debug).ok(); - - let web_options = eframe::WebOptions::default(); +#[shuttle_runtime::main] +async fn main() -> shuttle_axum::ShuttleAxum { + let router = Router::new() + .nest_service("/", ServeDir::new(PathBuf::from("nes-studio-app/dist"))) + .layer( + ServiceBuilder::new() + .layer(TraceLayer::new_for_http()) + .layer(CompressionLayer::new()) + .layer(NormalizePathLayer::trim_trailing_slash()), + ); - wasm_bindgen_futures::spawn_local(async { - eframe::WebRunner::new() - .start( - "the_canvas_id", // hardcode it - web_options, - Box::new(|cc| Box::new(nes_studio::TemplateApp::new(cc))), - ) - .await - .expect("failed to start eframe"); - }); + Ok(router.into()) }