From 1e77a7d831c88009d325d5a2d84dc2f7735acada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Thu, 20 Feb 2025 09:49:40 +0100 Subject: [PATCH 01/21] Wrap `swap` --- src/commands.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/commands.rs diff --git a/src/commands.rs b/src/commands.rs new file mode 100644 index 0000000..9cf9c79 --- /dev/null +++ b/src/commands.rs @@ -0,0 +1,11 @@ +use tauri_sys::Error; +use tauri_sys::tauri::invoke; + +pub struct Swap { + store: &str, + acc: i64, +} +pub async fn swap(store: &str, acc: i64) -> Result<(), Error> { + let args = Swap { store, acc }; + invoke("swap", &args) +} From e03a16d13e9bc1423e1251f187f317e86cbe2ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Fri, 21 Feb 2025 22:19:51 +0100 Subject: [PATCH 02/21] Minimal Leptos setup --- .gitignore | 4 + Cargo.lock | 1282 +++++++++++++++++---- Cargo.toml | 39 +- Trunk.toml | 9 + build.rs | 6 +- {www/assets => font}/hessen_sagt_nein.otf | Bin {www/assets => img}/aldi.svg | 0 {www/assets => img}/angel.svg | 0 {www/assets => img}/cafe.svg | 0 {www/assets => img}/cash.svg | 0 {www/assets => img}/dm.svg | 0 {www/assets => img}/edeka.svg | 0 icon.svg => img/icon.svg | 0 {www/assets => img}/lidl.svg | 0 {www/assets => img}/rewe.svg | 0 {www/assets => img}/tegut.svg | 0 src/bin/leptos.rs | 5 + src/{main.rs => bin/tauri.rs} | 0 src/commands.rs | 7 +- src/lib.rs | 202 +--- src/{ => server}/app_state.rs | 0 src/{ => server}/data_door.rs | 2 +- src/{ => server}/isrg-root-x1.pem | 0 src/server/mod.rs | 200 ++++ www/styles.css => styles.scss | 0 tauri.conf.json | 6 +- trunk.html | 12 + www/index.html | 188 --- www/main.js | 67 -- 29 files changed, 1345 insertions(+), 684 deletions(-) create mode 100644 Trunk.toml rename {www/assets => font}/hessen_sagt_nein.otf (100%) rename {www/assets => img}/aldi.svg (100%) rename {www/assets => img}/angel.svg (100%) rename {www/assets => img}/cafe.svg (100%) rename {www/assets => img}/cash.svg (100%) rename {www/assets => img}/dm.svg (100%) rename {www/assets => img}/edeka.svg (100%) rename icon.svg => img/icon.svg (100%) rename {www/assets => img}/lidl.svg (100%) rename {www/assets => img}/rewe.svg (100%) rename {www/assets => img}/tegut.svg (100%) create mode 100644 src/bin/leptos.rs rename src/{main.rs => bin/tauri.rs} (100%) rename src/{ => server}/app_state.rs (100%) rename src/{ => server}/data_door.rs (98%) rename src/{ => server}/isrg-root-x1.pem (100%) create mode 100644 src/server/mod.rs rename www/styles.css => styles.scss (100%) create mode 100644 trunk.html delete mode 100644 www/index.html delete mode 100644 www/main.js diff --git a/.gitignore b/.gitignore index 602df2d..cc1a33d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ gen/ # Generated by `cargo tauri icon` # will have various versions of the app icon icons/ + +# Generated by Trunk +# will have the files to be served over http +www/ diff --git a/Cargo.lock b/Cargo.lock index de948fa..9db229b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,10 +67,21 @@ dependencies = [ ] [[package]] -name = "anyhow" -version = "1.0.95" +name = "any_spawner" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "41058deaa38c9d9dd933d6d238d825227cffa668e2839b52879f6619c63eee3b" +dependencies = [ + "futures", + "thiserror 2.0.11", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[package]] name = "async-broadcast" @@ -244,6 +255,36 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attribute-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0053e96dd3bec5b4879c23a138d6ef26f2cb936c9cdc96274ac2b9ed44b5bb54" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463b53ad0fd5b460af4b1915fe045ff4d946d025fb6c4dc3337752eaa980f71b" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn 2.0.98", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -310,6 +351,7 @@ version = "0.1.0" dependencies = [ "chrono", "curl", + "leptos", "openssl", "rand 0.8.5", "ring-compat", @@ -320,6 +362,7 @@ dependencies = [ "tauri-build", "tauri-plugin-fs", "tauri-plugin-opener", + "tauri-sys", "tokio", ] @@ -344,7 +387,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d59b4c170e16f0405a2e95aff44432a0d41aa97675f3d52623effe95792a037" +dependencies = [ + "objc2 0.6.0", ] [[package]] @@ -477,9 +529,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.13" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "shlex", ] @@ -568,6 +620,23 @@ dependencies = [ "objc", ] +[[package]] +name = "codee" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.11", +] + +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + [[package]] name = "combine" version = "4.6.7" @@ -587,18 +656,66 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "config" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +dependencies = [ + "convert_case 0.6.0", + "nom", + "pathdiff", + "serde", + "toml 0.8.20", +] + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + [[package]] name = "convert_case" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.18.1" @@ -758,9 +875,9 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.78+curl-8.11.0" +version = "0.4.80+curl-8.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eec768341c5c7789611ae51cf6c459099f22e64a5d5d0ce4892434e33821eaf" +checksum = "55f7df2eac63200c3ab25bde3b2268ef2ee56af3d238e76d61f01c3c49bff734" dependencies = [ "cc", "libc", @@ -806,6 +923,20 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.7.9" @@ -826,13 +957,24 @@ dependencies = [ "serde", ] +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "derive_more" version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", @@ -940,6 +1082,12 @@ dependencies = [ "serde", ] +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + [[package]] name = "dtoa" version = "1.0.9" @@ -988,6 +1136,22 @@ dependencies = [ "signature", ] +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "either_of" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "169ae1dd00fb612cf27fd069b3b10f325ea60ac551f08e5b931b4413972a847d" +dependencies = [ + "paste", + "pin-project-lite", +] + [[package]] name = "elliptic-curve" version = "0.13.8" @@ -1055,9 +1219,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" @@ -1230,6 +1394,21 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1237,6 +1416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -1254,6 +1434,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -1304,6 +1485,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1561,6 +1743,40 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gobject-sys" version = "0.18.0" @@ -1635,12 +1851,24 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "guardian" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.2" @@ -1671,6 +1899,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hermit-abi" version = "0.4.0" @@ -1683,6 +1917,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + [[package]] name = "html5ever" version = "0.26.0" @@ -1737,6 +1980,22 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +[[package]] +name = "hydration_context" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d35485b3dcbf7e044b8f28c73f04f13e7b509c2466fd10cb2a8a447e38f8a93a" +dependencies = [ + "futures", + "js-sys", + "once_cell", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", + "wasm-bindgen", +] + [[package]] name = "hyper" version = "1.6.0" @@ -2002,6 +2261,21 @@ dependencies = [ "cfb", ] +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "inventory" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b12ebb6799019b044deaf431eadfe23245b259bba5a2c0796acec3943a3cdb" +dependencies = [ + "rustversion", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -2027,6 +2301,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -2146,6 +2429,129 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leptos" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88613d81f70f4e267473b2ee107e1ee70cf765a3c3dfee945929c8e9c520b957" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "send_wrapper", + "serde", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror 2.0.11", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4172cfee12576224775ccfbb9d3e76625017a8b4207c4641a2f9b96a70e6d524" +dependencies = [ + "config", + "regex", + "serde", + "thiserror 2.0.11", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41f6dc3ddaa09d876d7015f08f4f3905787da4ea5460cef130c365419483a89" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f5c961e5d9b2aa6deab39d5d842272e8b1b165744b5caf674770d5cf0daa04" +dependencies = [ + "anyhow", + "camino", + "indexmap 2.7.1", + "parking_lot", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 2.0.98", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b9165909eabb02188a4b33b0ab6acff408bdf440018bf65b30bba0d38d61b19" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case 0.6.0", + "html-escape", + "itertools", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error2", + "proc-macro2", + "quote", + "rstml", + "server_fn_macro", + "syn 2.0.98", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee9ed4526484b17561bc8ce1532c613e37be2c01788fed3d1c4104db674dd9" +dependencies = [ + "any_spawner", + "base64 0.22.1", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + [[package]] name = "libappindicator" version = "0.9.0" @@ -2219,6 +2625,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linear-map" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -2243,9 +2655,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "mac" @@ -2262,6 +2674,29 @@ dependencies = [ "libc", ] +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + [[package]] name = "markup5ever" version = "0.11.0" @@ -2304,10 +2739,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "miniz_oxide" -version = "0.8.3" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", "simd-adler32", @@ -2334,9 +2775,9 @@ dependencies = [ "dpi", "gtk", "keyboard-types", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "once_cell", "png", "serde", @@ -2380,6 +2821,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "next_tuple" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" + [[package]] name = "nix" version = "0.29.0" @@ -2399,6 +2846,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2414,6 +2871,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "num_enum" version = "0.7.3" @@ -2463,6 +2930,15 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" @@ -2470,15 +2946,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ "bitflags 2.8.0", - "block2", + "block2 0.5.1", "libc", - "objc2", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-quartz-core", ] +[[package]] +name = "objc2-app-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", + "objc2-core-foundation", + "objc2-foundation 0.3.0", +] + [[package]] name = "objc2-cloud-kit" version = "0.2.2" @@ -2486,10 +2974,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -2498,9 +2986,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2510,9 +2998,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +dependencies = [ + "bitflags 2.8.0", + "objc2-core-foundation", ] [[package]] @@ -2521,9 +3029,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -2533,10 +3041,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -2552,9 +3060,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.8.0", - "block2", + "block2 0.5.1", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +dependencies = [ + "bitflags 2.8.0", + "block2 0.6.0", + "objc2 0.6.0", + "objc2-core-foundation", ] [[package]] @@ -2563,10 +3083,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2576,9 +3096,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2588,9 +3108,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -2600,8 +3120,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2611,13 +3131,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", "objc2-quartz-core", "objc2-symbols", @@ -2631,9 +3151,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2643,10 +3163,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -2656,10 +3176,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" dependencies = [ "bitflags 2.8.0", - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2671,6 +3191,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "oco_ref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" +dependencies = [ + "serde", + "thiserror 1.0.69", +] + [[package]] name = "once_cell" version = "1.20.3" @@ -2691,9 +3221,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.70" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ "bitflags 2.8.0", "cfg-if", @@ -2723,18 +3253,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.1+3.4.0" +version = "300.4.2+3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.105" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -2749,6 +3279,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + [[package]] name = "ordered-stream" version = "0.2.0" @@ -2834,6 +3370,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.3" @@ -2980,6 +3522,26 @@ dependencies = [ "siphasher 1.0.1", ] +[[package]] +name = "pin-project" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3053,7 +3615,7 @@ checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", "rustix", "tracing", @@ -3081,6 +3643,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +dependencies = [ + "proc-macro2", + "syn 2.0.98", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -3115,7 +3687,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.23", + "toml_edit 0.22.24", ] [[package]] @@ -3142,12 +3714,45 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -3157,6 +3762,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "version_check", + "yansi", +] + [[package]] name = "quick-xml" version = "0.32.0" @@ -3206,9 +3824,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" dependencies = [ "cfg_aliases", "libc", @@ -3227,6 +3845,28 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quote-use" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "rand" version = "0.7.3" @@ -3315,10 +3955,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "redox_syscall" -version = "0.5.8" +name = "reactive_graph" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "9996b4c0f501d64a755ff3dfbe9276e9f834d105d7d45059ad4bd6d2a56477d0" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "or_poisoned", + "pin-project-lite", + "rustc-hash", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.11", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c3d2a20d8edd8ac6628718209f743da86349d7f10a4458304666c2ddfc082e" +dependencies = [ + "guardian", + "itertools", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d4d8e40112b8ee1424e5ec636fcbc9764c1a099e81f8fa818f6762b43cc10cd" +dependencies = [ + "convert_case 0.6.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "redox_syscall" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ "bitflags 2.8.0", ] @@ -3421,15 +4110,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "d34b5020fcdea098ef7d95e9f89ec15952123a4a039badd09fabebe9e963e839" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3453,6 +4141,21 @@ dependencies = [ "signature", ] +[[package]] +name = "rstml" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.98", + "syn_derive", + "thiserror 2.0.11", +] + [[package]] name = "rusqlite" version = "0.33.0" @@ -3503,9 +4206,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "once_cell", "ring", @@ -3650,10 +4353,19 @@ dependencies = [ ] [[package]] -name = "serde" -version = "1.0.217" +name = "send_wrapper" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -3670,10 +4382,21 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.217" +name = "serde-wasm-bindgen" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -3693,9 +4416,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa 1.0.14", "memchr", @@ -3703,6 +4426,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 1.0.69", +] + [[package]] name = "serde_repr" version = "0.1.19" @@ -3787,6 +4521,61 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "server_fn" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055476c2a42c9a98a69e3f0ce29b86aa3acbdef19a84e0523330f095097defcf" +dependencies = [ + "bytes", + "const_format", + "dashmap", + "futures", + "gloo-net", + "http", + "inventory", + "js-sys", + "once_cell", + "pin-project-lite", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 2.0.11", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e65737414a9583ce3b43dddd4e5dfb33fe385a6933ed79a9b539b8eb0767cd07" +dependencies = [ + "const_format", + "convert_case 0.6.0", + "proc-macro2", + "quote", + "syn 2.0.98", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563909a43390341403ab76fbc33fde306712613da02244e692eabeae8ffde949" +dependencies = [ + "server_fn_macro", + "syn 2.0.98", +] + [[package]] name = "servo_arc" version = "0.1.1" @@ -3860,10 +4649,19 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "slotmap" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" @@ -3887,8 +4685,8 @@ dependencies = [ "foreign-types 0.5.0", "js-sys", "log", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-quartz-core", "raw-window-handle", "redox_syscall", @@ -3923,12 +4721,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.7.3" @@ -3966,9 +4758,9 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ "phf_generator 0.11.3", "phf_shared 0.11.3", @@ -4021,6 +4813,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -4054,6 +4858,40 @@ dependencies = [ "version-compare", ] +[[package]] +name = "tachys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c05fed41ed4e334257090500510df21bb1611680c0cfd3be14acec7ffdf3d95" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "dyn-clone", + "either_of", + "futures", + "html-escape", + "indexmap 2.7.1", + "itertools", + "js-sys", + "linear-map", + "next_tuple", + "oco_ref", + "once_cell", + "or_poisoned", + "parking_lot", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "tao" version = "0.31.1" @@ -4131,9 +4969,9 @@ dependencies = [ "log", "mime", "muda", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "percent-encoding", "plist", "raw-window-handle", @@ -4270,8 +5108,8 @@ checksum = "635ed7c580dc3cdc61c94097d38ef517d749ffc0141c806d904e68e4b0cf1c2a" dependencies = [ "dunce", "glob", - "objc2-app-kit", - "objc2-foundation", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "open", "schemars", "serde", @@ -4313,9 +5151,9 @@ dependencies = [ "http", "jni", "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "percent-encoding", "raw-window-handle", "softbuffer", @@ -4329,6 +5167,22 @@ dependencies = [ "wry", ] +[[package]] +name = "tauri-sys" +version = "0.1.0" +source = "git+https://github.com/JonasKruckenberg/tauri-sys#e953a9c912212d43fa42add71bc84c40c30140e0" +dependencies = [ + "js-sys", + "log", + "serde", + "serde-wasm-bindgen", + "serde_repr", + "thiserror 1.0.69", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", +] + [[package]] name = "tauri-utils" version = "2.1.1" @@ -4378,9 +5232,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.16.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", @@ -4447,6 +5301,15 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "throw_error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ef8bf264c6ae02a065a4a16553283f0656bd6266fc1fcb09fd2e6b5e91427b" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "time" version = "0.3.37" @@ -4562,7 +5425,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.23", + "toml_edit 0.22.24", ] [[package]] @@ -4600,15 +5463,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.1", + "winnow 0.7.3", ] [[package]] @@ -4671,22 +5534,23 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" +checksum = "eadd75f5002e2513eaa19b2365f533090cc3e93abd38788452d9ea85cff7b48a" dependencies = [ - "core-graphics", "crossbeam-channel", - "dirs 5.0.1", + "dirs 6.0.0", "libappindicator", "muda", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.6.0", + "objc2-app-kit 0.3.0", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.0", "once_cell", "png", "serde", - "thiserror 1.0.69", + "thiserror 2.0.11", "windows-sys 0.59.0", ] @@ -4696,6 +5560,26 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-builder" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e14ed59dc8b7b26cacb2a92bad2e8b1f098806063898ab42a3bd121d7d45e75" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "typeid" version = "1.0.2" @@ -4704,9 +5588,9 @@ checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "uds_windows" @@ -4762,9 +5646,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-segmentation" @@ -4772,6 +5656,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -4814,6 +5704,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -4822,9 +5718,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" +checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" dependencies = [ "getrandom 0.3.1", "serde", @@ -4860,9 +5756,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" dependencies = [ "cc", "libc", @@ -5134,13 +6030,13 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window-vibrancy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" +checksum = "831ad7678290beae36be6f9fad9234139c7f00f3b536347de7745621716be82d" dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -5200,6 +6096,12 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" version = "0.2.0" @@ -5305,36 +6207,20 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows-version" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12476c23a74725c539b24eae8bfc0dac4029c39cdb561d9f23616accd4ae26d" +checksum = "7bfbcc4996dd183ff1376a20ade1242da0d2dcaff83cc76710a588d24fd4c5db" dependencies = [ - "windows-targets 0.53.0", + "windows-link", ] [[package]] @@ -5355,12 +6241,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -5379,12 +6259,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -5403,24 +6277,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -5439,12 +6301,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -5463,12 +6319,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5487,12 +6337,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -5511,12 +6355,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.5.40" @@ -5528,9 +6366,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] @@ -5573,7 +6411,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2e33c08b174442ff80d5c791020696f9f8b4e4a87b8cfc7494aad6167ec44e1" dependencies = [ "base64 0.22.1", - "block2", + "block2 0.5.1", "cookie", "crossbeam-channel", "dpi", @@ -5587,9 +6425,9 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -5640,6 +6478,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.7.5" @@ -5693,7 +6543,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.1", + "winnow 0.7.3", "xdg-home", "zbus_macros", "zbus_names", @@ -5723,7 +6573,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.1", + "winnow 0.7.3", "zvariant", ] @@ -5807,7 +6657,7 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "winnow 0.7.1", + "winnow 0.7.3", "zvariant_derive", "zvariant_utils", ] @@ -5836,5 +6686,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.98", - "winnow 0.7.1", + "winnow 0.7.3", ] diff --git a/Cargo.toml b/Cargo.toml index c51920e..f64612c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,22 @@ description = "Buchhaltung für „Darmstadt sagt Nein zur Bezahlkarte!“" authors = ["Bianca Fürstenau"] edition = "2021" +[features] +tauri = ["server"] +leptos = [] +server = [ + "dep:tauri", + "dep:tauri-plugin-opener", + "dep:tauri-plugin-fs", + "dep:rusqlite", + "dep:rand", + "dep:chrono", + "dep:tokio", + "dep:curl", + "dep:openssl", + "dep:ring-compat", +] + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] @@ -18,15 +34,18 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = [] } -tauri-plugin-opener = "2" +leptos = { version = "^0.7", features = ["ssr"] } +tauri-sys = { git = "https://github.com/JonasKruckenberg/tauri-sys", features = ["tauri"] } serde = { version = "1", features = ["derive"] } serde_json = "1" -rusqlite = {version = "^0.33", features = ["backup", "bundled"] } -rand = {version = "^0.8"} -chrono = {version = "^0.4"} -tokio = {version = "^1.43"} -tauri-plugin-fs = {version = "2"} -curl = {version = "^0.4"} -openssl = {version = "^0.10", features = ["vendored"] } -ring-compat = {version = "^0.8", features = ["signature", "rand_core"] } + +tauri = { version = "2", features = [], optional = true } +tauri-plugin-opener = { version = "2", optional = true } +tauri-plugin-fs = {version = "2", optional = true} +rusqlite = {version = "^0.33", features = ["backup", "bundled"], optional = true } +rand = {version = "^0.8", optional = true} +chrono = {version = "^0.4", optional = true} +tokio = {version = "^1.43", optional = true} +curl = {version = "^0.4", optional = true} +openssl = {version = "^0.10", features = ["vendored"], optional = true} +ring-compat = {version = "^0.8", features = ["signature", "rand_core"], optional = true} diff --git a/Trunk.toml b/Trunk.toml new file mode 100644 index 0000000..29257e2 --- /dev/null +++ b/Trunk.toml @@ -0,0 +1,9 @@ +[build] +target = "trunk.html" +html_output = "index.html" +dist = "www" + +[serve] +port = 1420 +open = false +ws_protocol = "ws" diff --git a/build.rs b/build.rs index c1ea373..9e3463b 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,7 @@ fn main() { - tauri_build::build() + if cfg!(feature = "tauri") { + tauri_build::build(); + } else { + println!("cargo::rustc-check-cfg=cfg(mobile)"); + } } diff --git a/www/assets/hessen_sagt_nein.otf b/font/hessen_sagt_nein.otf similarity index 100% rename from www/assets/hessen_sagt_nein.otf rename to font/hessen_sagt_nein.otf diff --git a/www/assets/aldi.svg b/img/aldi.svg similarity index 100% rename from www/assets/aldi.svg rename to img/aldi.svg diff --git a/www/assets/angel.svg b/img/angel.svg similarity index 100% rename from www/assets/angel.svg rename to img/angel.svg diff --git a/www/assets/cafe.svg b/img/cafe.svg similarity index 100% rename from www/assets/cafe.svg rename to img/cafe.svg diff --git a/www/assets/cash.svg b/img/cash.svg similarity index 100% rename from www/assets/cash.svg rename to img/cash.svg diff --git a/www/assets/dm.svg b/img/dm.svg similarity index 100% rename from www/assets/dm.svg rename to img/dm.svg diff --git a/www/assets/edeka.svg b/img/edeka.svg similarity index 100% rename from www/assets/edeka.svg rename to img/edeka.svg diff --git a/icon.svg b/img/icon.svg similarity index 100% rename from icon.svg rename to img/icon.svg diff --git a/www/assets/lidl.svg b/img/lidl.svg similarity index 100% rename from www/assets/lidl.svg rename to img/lidl.svg diff --git a/www/assets/rewe.svg b/img/rewe.svg similarity index 100% rename from www/assets/rewe.svg rename to img/rewe.svg diff --git a/www/assets/tegut.svg b/img/tegut.svg similarity index 100% rename from www/assets/tegut.svg rename to img/tegut.svg diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs new file mode 100644 index 0000000..570d45c --- /dev/null +++ b/src/bin/leptos.rs @@ -0,0 +1,5 @@ +use leptos::prelude::*; + +fn main() { + leptos::mount::mount_to_body(|| view! {

"Hello, world!"

}) +} diff --git a/src/main.rs b/src/bin/tauri.rs similarity index 100% rename from src/main.rs rename to src/bin/tauri.rs diff --git a/src/commands.rs b/src/commands.rs index 9cf9c79..2b92214 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,11 +1,12 @@ use tauri_sys::Error; use tauri_sys::tauri::invoke; -pub struct Swap { - store: &str, +#[derive(serde::Serialize)] +pub struct Swap<'a> { + store: &'a str, acc: i64, } pub async fn swap(store: &str, acc: i64) -> Result<(), Error> { let args = Swap { store, acc }; - invoke("swap", &args) + invoke("swap", &args).await } diff --git a/src/lib.rs b/src/lib.rs index b21e1f0..2f8d086 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,201 +1,9 @@ -use chrono::offset::Utc; -use rusqlite::{types::ToSqlOutput, ToSql}; -use tauri::{Manager, State}; -use tauri_plugin_fs::FsExt; -use tokio::sync::Mutex; -use std::collections::HashMap; - -mod app_state; -mod data_door; - -use app_state::AppState; - -#[derive(Clone, Copy, Debug)] -enum Store { - Aldi, - Edeka, - Dm, - Lidl, - Rewe, - Tegut, -} - -#[derive(Clone, Copy, Debug)] -enum Account { - Sumpf, - Heinersyndikat, -} - -struct Inventory { - acc: Account, - cash: i64, - vouchers: Vec, -} - -#[derive(Debug)] -struct VoucherInventory { - store: Store, - count: i64, -} - -impl TryFrom<&str> for Store { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "aldi" => Ok(Store::Aldi), - "edeka" => Ok(Store::Edeka), - "dm" => Ok(Store::Dm), - "lidl" => Ok(Store::Lidl), - "rewe" => Ok(Store::Rewe), - "tegut" => Ok(Store::Tegut), - _ => Err(()), - } - } -} - -impl TryFrom<&str> for Account { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "sumpf" => Ok(Account::Sumpf), - "hs" => Ok(Account::Heinersyndikat), - _ => Err(()), - } - } -} - -impl ToSql for Store { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Store::Aldi => 0.to_sql(), - Store::Edeka => 1.to_sql(), - Store::Dm => 2.to_sql(), - Store::Lidl => 3.to_sql(), - Store::Rewe => 4.to_sql(), - Store::Tegut => 5.to_sql(), - } - } -} - -impl ToSql for Account { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Account::Sumpf => 0.to_sql(), - Account::Heinersyndikat => 1.to_sql(), - } - } -} - -fn parse_inventory(data: HashMap) -> Result { - let a = data.get("cafe-inventory-acc").ok_or(())?; - let acc: Account = Account::try_from(a.as_ref())?; - let mut vouchers = Vec::new(); - for s in ["aldi", "dm", "lidl", "rewe", "tegut"] { - let Ok(store) = s.try_into() else { - println!("Did not find '{}' in inventory data.", s); - continue; - }; - match data.get(&format!("cafe-inventory-{}", s)) { - None => (), - Some(c) => { - let c = if c == "" {"0"} else {c}; - let Ok(count) = c.parse() else { - println!("Invalid count '{}' for '{}' in inventory data.", c, s); - continue; - }; - let v = VoucherInventory { store, count }; - vouchers.push(v); - }, - } - } - unimplemented!() -} - -#[tauri::command] -async fn inventory( - data: HashMap, - state: State<'_, Mutex>, -) -> Result<(), ()> { - let now = Utc::now().timestamp(); - let state = state.lock().await; - let inv = parse_inventory(data)?; - for v in inv.vouchers { - state.db.execute( - "INSERT INTO voucher_inventory VALUES ()", - ( - inv.acc, - v.store, - v.count, - now, - ), - ) - .map_err(|e| println!("{:?}", e))?; - }; - Ok(()) -} - -#[tauri::command] -async fn swap( - store: &str, - acc: i64, - state: State<'_, Mutex>, -) -> Result<(), ()> { - let state = state.lock().await; - let store: Store = store.try_into()?; - state.db.execute( - "INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5)", - ( - store, - acc, - i64::from_ne_bytes(state.id.to_ne_bytes()), - Utc::now().timestamp(), - false, - ), - ) - .map_err(|e| println!("{:?}", e))?; - Ok(()) -} - -#[tauri::command] -async fn count(state: State<'_, Mutex>) -> Result { - let state = state.lock().await; - let mut stmt = - state.db.prepare("SELECT COUNT(*) FROM swap") - .map_err(|e| println!("{:?}", e))?; - let mut rows = stmt.query([]).map_err(|e| println!("{:?}", e))?; - let row = rows.next().map_err(|e| println!("{:?}", e))?; - let row = match row { - Some(r) => Ok(r), - None => { - println!("No rows"); - Err(()) - } - }?; - let cnt: u64 = row.get(0).map_err(|e| println!("{:?}", e))?; - Ok(cnt.to_string()) -} +mod commands; +#[cfg(feature = "server")] +mod server; +#[cfg(feature = "server")] #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - let state = AppState::new(); - tauri::Builder::default() - .plugin(tauri_plugin_fs::init()) - .setup(|app| { - app.manage(Mutex::new(state)); - let scope = app.fs_scope(); - let path = app.path(); - scope.allow_directory(path.temp_dir()?, false)?; - Ok(()) - }) - .invoke_handler(tauri::generate_handler![ - swap, - count, - inventory, - data_door::pull_data, - data_door::push_data, - ]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + server::run(); } diff --git a/src/app_state.rs b/src/server/app_state.rs similarity index 100% rename from src/app_state.rs rename to src/server/app_state.rs diff --git a/src/data_door.rs b/src/server/data_door.rs similarity index 98% rename from src/data_door.rs rename to src/server/data_door.rs index a96441e..555c9ac 100644 --- a/src/data_door.rs +++ b/src/server/data_door.rs @@ -6,7 +6,7 @@ use ring_compat::signature::ed25519::SigningKey; use tauri::{Manager, State}; use tokio::sync::Mutex; -use crate::app_state::AppState; +use crate::server::app_state::AppState; #[derive(Debug)] struct Collector(Vec, Vec, usize); diff --git a/src/isrg-root-x1.pem b/src/server/isrg-root-x1.pem similarity index 100% rename from src/isrg-root-x1.pem rename to src/server/isrg-root-x1.pem diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..70a9f56 --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,200 @@ +use chrono::offset::Utc; +use rusqlite::{types::ToSqlOutput, ToSql}; +use tauri::{Manager, State}; +use tauri_plugin_fs::FsExt; +use tokio::sync::Mutex; +use std::collections::HashMap; + +mod app_state; +mod data_door; + +use app_state::AppState; + +#[derive(Clone, Copy, Debug)] +enum Store { + Aldi, + Edeka, + Dm, + Lidl, + Rewe, + Tegut, +} + +#[derive(Clone, Copy, Debug)] +enum Account { + Sumpf, + Heinersyndikat, +} + +struct Inventory { + acc: Account, + cash: i64, + vouchers: Vec, +} + +#[derive(Debug)] +struct VoucherInventory { + store: Store, + count: i64, +} + +impl TryFrom<&str> for Store { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "aldi" => Ok(Store::Aldi), + "edeka" => Ok(Store::Edeka), + "dm" => Ok(Store::Dm), + "lidl" => Ok(Store::Lidl), + "rewe" => Ok(Store::Rewe), + "tegut" => Ok(Store::Tegut), + _ => Err(()), + } + } +} + +impl TryFrom<&str> for Account { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "sumpf" => Ok(Account::Sumpf), + "hs" => Ok(Account::Heinersyndikat), + _ => Err(()), + } + } +} + +impl ToSql for Store { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Store::Aldi => 0.to_sql(), + Store::Edeka => 1.to_sql(), + Store::Dm => 2.to_sql(), + Store::Lidl => 3.to_sql(), + Store::Rewe => 4.to_sql(), + Store::Tegut => 5.to_sql(), + } + } +} + +impl ToSql for Account { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Account::Sumpf => 0.to_sql(), + Account::Heinersyndikat => 1.to_sql(), + } + } +} + +fn parse_inventory(data: HashMap) -> Result { + let a = data.get("cafe-inventory-acc").ok_or(())?; + let acc: Account = Account::try_from(a.as_ref())?; + let mut vouchers = Vec::new(); + for s in ["aldi", "dm", "lidl", "rewe", "tegut"] { + let Ok(store) = s.try_into() else { + println!("Did not find '{}' in inventory data.", s); + continue; + }; + match data.get(&format!("cafe-inventory-{}", s)) { + None => (), + Some(c) => { + let c = if c == "" {"0"} else {c}; + let Ok(count) = c.parse() else { + println!("Invalid count '{}' for '{}' in inventory data.", c, s); + continue; + }; + let v = VoucherInventory { store, count }; + vouchers.push(v); + }, + } + } + unimplemented!() +} + +#[tauri::command] +async fn inventory( + data: HashMap, + state: State<'_, Mutex>, +) -> Result<(), ()> { + let now = Utc::now().timestamp(); + let state = state.lock().await; + let inv = parse_inventory(data)?; + for v in inv.vouchers { + state.db.execute( + "INSERT INTO voucher_inventory VALUES ()", + ( + inv.acc, + v.store, + v.count, + now, + ), + ) + .map_err(|e| println!("{:?}", e))?; + }; + Ok(()) +} + +#[tauri::command] +async fn swap( + store: &str, + acc: i64, + state: State<'_, Mutex>, +) -> Result<(), ()> { + let state = state.lock().await; + let store: Store = store.try_into()?; + state.db.execute( + "INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5)", + ( + store, + acc, + i64::from_ne_bytes(state.id.to_ne_bytes()), + Utc::now().timestamp(), + false, + ), + ) + .map_err(|e| println!("{:?}", e))?; + Ok(()) +} + +#[tauri::command] +async fn count(state: State<'_, Mutex>) -> Result { + let state = state.lock().await; + let mut stmt = + state.db.prepare("SELECT COUNT(*) FROM swap") + .map_err(|e| println!("{:?}", e))?; + let mut rows = stmt.query([]).map_err(|e| println!("{:?}", e))?; + let row = rows.next().map_err(|e| println!("{:?}", e))?; + let row = match row { + Some(r) => Ok(r), + None => { + println!("No rows"); + Err(()) + } + }?; + let cnt: u64 = row.get(0).map_err(|e| println!("{:?}", e))?; + Ok(cnt.to_string()) +} + +pub fn run() { + let state = AppState::new(); + tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) + .setup(|app| { + app.manage(Mutex::new(state)); + let scope = app.fs_scope(); + let path = app.path(); + scope.allow_directory(path.temp_dir()?, false)?; + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + swap, + count, + inventory, + data_door::pull_data, + data_door::push_data, + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/www/styles.css b/styles.scss similarity index 100% rename from www/styles.css rename to styles.scss diff --git a/tauri.conf.json b/tauri.conf.json index 2e1ed07..5ef499e 100644 --- a/tauri.conf.json +++ b/tauri.conf.json @@ -4,7 +4,11 @@ "version": "0.1.0", "identifier": "de.mathebau.bkbh", "build": { - "frontendDist": "www" + "beforeDevCommand": "cd bkbh && trunk serve", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "cd bkbh && trunk build", + "frontendDist": "www", + "features": ["tauri"] }, "app": { "withGlobalTauri": true, diff --git a/trunk.html b/trunk.html new file mode 100644 index 0000000..5562473 --- /dev/null +++ b/trunk.html @@ -0,0 +1,12 @@ + + + + + + + Darmstadt sagt Nein zur Bezahlkartei! + + + + + diff --git a/www/index.html b/www/index.html deleted file mode 100644 index d078ceb..0000000 --- a/www/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - Darmstadt sagt Nein zur Bezahlkartei! - - - - - -
-
-
-
-
-
- - - diff --git a/www/main.js b/www/main.js deleted file mode 100644 index f3ada68..0000000 --- a/www/main.js +++ /dev/null @@ -1,67 +0,0 @@ -const { invoke } = window.__TAURI__.core; - -let callbacks = { - '#nav-cafe': () => activate("", "cafe", ["angel"]), - '#nav-angel': () => activate("", "angel", ["cafe"]), - '#cafe-nav-inventory': () => activate("cafe-", "inventory", ["voucher"]), - '#cafe-nav-voucher': () => activate("cafe-", "voucher", ["inventory"]), - '#cafe-inventory form': () => inventory(), - '#cafe-voucher-aldi': () => swap("aldi"), - '#cafe-voucher-dm': () => swap("dm"), - '#cafe-voucher-lidl': () => swap("lidl"), - '#cafe-voucher-rewe': () => swap("rewe"), - '#cafe-voucher-tegut': () => swap("tegut"), -} -let stores = [ - "aldi", - "dm", - "lidl", - "rewe", - "tegut", -] - -async function increment(el) { - var el = document.querySelector(el+" input"); - let v = parseInt(el.value, 10); - v = isNaN(v) ? 0 : v; - v++; - el.value = v; -} - -async function inventory() { - const form = document.querySelector("#cafe-inventory form"); - const fd = new FormData(form); - const obj = Object.fromEntries(fd); - await invoke("inventory", { data: obj }); -} - -async function swap(s) { - await invoke("swap", { store: s, acc: 1 }); - document.querySelector("h1").textContent = await invoke("count", {}); -} - -async function activate(ctx, el, nels) { - document.querySelector("#"+ctx+el).style.display = ""; - for (const nel of nels) { - document.querySelector("#"+ctx+nel).style.display = "none"; - } - document.querySelector("#"+ctx+"nav").classList.remove("v-container"); - document.querySelector("#"+ctx+"nav").classList.add("h-container"); -} - -window.addEventListener("DOMContentLoaded", () => { - for (let key in callbacks) { - if (callbacks.hasOwnProperty(key)) { - document.querySelector(key).addEventListener("submit", (e) => { - e.preventDefault(); - callbacks[key](); - }); - } - } - for (const store of stores) { - document.querySelector("#cafe-inventory-"+store+" label").addEventListener("click", (e) => { - e.preventDefault(); - increment("#cafe-inventory-"+store); - }); - } -}); From 49a9810fd8f9c3ca5cdd7a3285eb4abc3bd97ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Sat, 22 Feb 2025 07:09:34 +0100 Subject: [PATCH 03/21] Something running --- Cargo.lock | 30 +++---- Cargo.toml | 7 +- {img => assets}/aldi.svg | 0 {img => assets}/angel.svg | 0 {img => assets}/cafe.svg | 0 {img => assets}/cash.svg | 0 {img => assets}/dm.svg | 0 {img => assets}/edeka.svg | 0 {font => assets}/hessen_sagt_nein.otf | Bin {img => assets}/icon.svg | 0 {img => assets}/lidl.svg | 0 {img => assets}/rewe.svg | 0 {img => assets}/tegut.svg | 0 src/bin/leptos.rs | 32 ++++++- src/commands.rs | 2 +- src/lib.rs | 32 ++++++- src/server/mod.rs | 117 ++------------------------ src/types.rs | 84 ++++++++++++++++++ trunk.html | 1 + 19 files changed, 173 insertions(+), 132 deletions(-) rename {img => assets}/aldi.svg (100%) rename {img => assets}/angel.svg (100%) rename {img => assets}/cafe.svg (100%) rename {img => assets}/cash.svg (100%) rename {img => assets}/dm.svg (100%) rename {img => assets}/edeka.svg (100%) rename {font => assets}/hessen_sagt_nein.otf (100%) rename {img => assets}/icon.svg (100%) rename {img => assets}/lidl.svg (100%) rename {img => assets}/rewe.svg (100%) rename {img => assets}/tegut.svg (100%) create mode 100644 src/types.rs diff --git a/Cargo.lock b/Cargo.lock index 9db229b..df3aedb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -350,6 +350,7 @@ name = "bkbh" version = "0.1.0" dependencies = [ "chrono", + "console_error_panic_hook", "curl", "leptos", "openssl", @@ -669,6 +670,16 @@ dependencies = [ "toml 0.8.20", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -1987,13 +1998,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d35485b3dcbf7e044b8f28c73f04f13e7b509c2466fd10cb2a8a447e38f8a93a" dependencies = [ "futures", - "js-sys", "once_cell", "or_poisoned", "pin-project-lite", "serde", "throw_error", - "wasm-bindgen", ] [[package]] @@ -2267,15 +2276,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" -[[package]] -name = "inventory" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b12ebb6799019b044deaf431eadfe23245b259bba5a2c0796acec3943a3cdb" -dependencies = [ - "rustversion", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -2439,6 +2439,7 @@ dependencies = [ "cfg-if", "either_of", "futures", + "getrandom 0.2.15", "hydration_context", "leptos_config", "leptos_dom", @@ -4533,7 +4534,6 @@ dependencies = [ "futures", "gloo-net", "http", - "inventory", "js-sys", "once_cell", "pin-project-lite", @@ -5169,16 +5169,16 @@ dependencies = [ [[package]] name = "tauri-sys" -version = "0.1.0" -source = "git+https://github.com/JonasKruckenberg/tauri-sys#e953a9c912212d43fa42add71bc84c40c30140e0" +version = "0.2.0" dependencies = [ + "derive_more", + "futures", "js-sys", "log", "serde", "serde-wasm-bindgen", "serde_repr", "thiserror 1.0.69", - "url", "wasm-bindgen", "wasm-bindgen-futures", ] diff --git a/Cargo.toml b/Cargo.toml index f64612c..cceaad0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,10 +34,10 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] -leptos = { version = "^0.7", features = ["ssr"] } -tauri-sys = { git = "https://github.com/JonasKruckenberg/tauri-sys", features = ["tauri"] } +leptos = { version = "^0.7", features = ["csr"] } +tauri-sys = { path = "../tauri-sys", features = ["core"] } serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json = { version = "1" } tauri = { version = "2", features = [], optional = true } tauri-plugin-opener = { version = "2", optional = true } @@ -49,3 +49,4 @@ tokio = {version = "^1.43", optional = true} curl = {version = "^0.4", optional = true} openssl = {version = "^0.10", features = ["vendored"], optional = true} ring-compat = {version = "^0.8", features = ["signature", "rand_core"], optional = true} +console_error_panic_hook = {version = "0.1.7"} diff --git a/img/aldi.svg b/assets/aldi.svg similarity index 100% rename from img/aldi.svg rename to assets/aldi.svg diff --git a/img/angel.svg b/assets/angel.svg similarity index 100% rename from img/angel.svg rename to assets/angel.svg diff --git a/img/cafe.svg b/assets/cafe.svg similarity index 100% rename from img/cafe.svg rename to assets/cafe.svg diff --git a/img/cash.svg b/assets/cash.svg similarity index 100% rename from img/cash.svg rename to assets/cash.svg diff --git a/img/dm.svg b/assets/dm.svg similarity index 100% rename from img/dm.svg rename to assets/dm.svg diff --git a/img/edeka.svg b/assets/edeka.svg similarity index 100% rename from img/edeka.svg rename to assets/edeka.svg diff --git a/font/hessen_sagt_nein.otf b/assets/hessen_sagt_nein.otf similarity index 100% rename from font/hessen_sagt_nein.otf rename to assets/hessen_sagt_nein.otf diff --git a/img/icon.svg b/assets/icon.svg similarity index 100% rename from img/icon.svg rename to assets/icon.svg diff --git a/img/lidl.svg b/assets/lidl.svg similarity index 100% rename from img/lidl.svg rename to assets/lidl.svg diff --git a/img/rewe.svg b/assets/rewe.svg similarity index 100% rename from img/rewe.svg rename to assets/rewe.svg diff --git a/img/tegut.svg b/assets/tegut.svg similarity index 100% rename from img/tegut.svg rename to assets/tegut.svg diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs index 570d45c..4737730 100644 --- a/src/bin/leptos.rs +++ b/src/bin/leptos.rs @@ -1,5 +1,35 @@ use leptos::prelude::*; +use bkbh_lib::commands::*; +use leptos::task::spawn_local; + +use bkbh_lib::types::*; + +#[component] +fn SwapButton(store: Store, img_path: &'static str, pretty: &'static str) -> impl IntoView { + view! { + + } +} fn main() { - leptos::mount::mount_to_body(|| view! {

"Hello, world!"

}) + console_error_panic_hook::set_once(); + leptos::mount::mount_to_body(|| view! { + + }); } diff --git a/src/commands.rs b/src/commands.rs index 2b92214..d6e13ed 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,5 +1,5 @@ use tauri_sys::Error; -use tauri_sys::tauri::invoke; +use tauri_sys::core::invoke; #[derive(serde::Serialize)] pub struct Swap<'a> { diff --git a/src/lib.rs b/src/lib.rs index 2f8d086..366d39a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,33 @@ -mod commands; +pub mod commands; #[cfg(feature = "server")] -mod server; +pub mod server; +pub mod types; -#[cfg(feature = "server")] +#[cfg(all(feature = "tauri", feature="server"))] #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - server::run(); + use tauri::{Manager, State}; + use tauri_plugin_fs::FsExt; + use server::app_state::AppState; + use tokio::sync::Mutex; + + let state = AppState::new(); + tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) + .setup(|app| { + app.manage(Mutex::new(state)); + let scope = app.fs_scope(); + let path = app.path(); + scope.allow_directory(path.temp_dir()?, false)?; + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + server::swap, + server::count, + server::inventory, + server::data_door::pull_data, + server::data_door::push_data, + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); } diff --git a/src/server/mod.rs b/src/server/mod.rs index 70a9f56..1595f83 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,93 +1,16 @@ use chrono::offset::Utc; use rusqlite::{types::ToSqlOutput, ToSql}; -use tauri::{Manager, State}; -use tauri_plugin_fs::FsExt; -use tokio::sync::Mutex; use std::collections::HashMap; +use tokio::sync::Mutex; +use tauri::{Manager, State}; -mod app_state; -mod data_door; +use crate::types::*; + +pub mod app_state; +pub mod data_door; use app_state::AppState; -#[derive(Clone, Copy, Debug)] -enum Store { - Aldi, - Edeka, - Dm, - Lidl, - Rewe, - Tegut, -} - -#[derive(Clone, Copy, Debug)] -enum Account { - Sumpf, - Heinersyndikat, -} - -struct Inventory { - acc: Account, - cash: i64, - vouchers: Vec, -} - -#[derive(Debug)] -struct VoucherInventory { - store: Store, - count: i64, -} - -impl TryFrom<&str> for Store { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "aldi" => Ok(Store::Aldi), - "edeka" => Ok(Store::Edeka), - "dm" => Ok(Store::Dm), - "lidl" => Ok(Store::Lidl), - "rewe" => Ok(Store::Rewe), - "tegut" => Ok(Store::Tegut), - _ => Err(()), - } - } -} - -impl TryFrom<&str> for Account { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "sumpf" => Ok(Account::Sumpf), - "hs" => Ok(Account::Heinersyndikat), - _ => Err(()), - } - } -} - -impl ToSql for Store { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Store::Aldi => 0.to_sql(), - Store::Edeka => 1.to_sql(), - Store::Dm => 2.to_sql(), - Store::Lidl => 3.to_sql(), - Store::Rewe => 4.to_sql(), - Store::Tegut => 5.to_sql(), - } - } -} - -impl ToSql for Account { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Account::Sumpf => 0.to_sql(), - Account::Heinersyndikat => 1.to_sql(), - } - } -} - fn parse_inventory(data: HashMap) -> Result { let a = data.get("cafe-inventory-acc").ok_or(())?; let acc: Account = Account::try_from(a.as_ref())?; @@ -114,7 +37,7 @@ fn parse_inventory(data: HashMap) -> Result { } #[tauri::command] -async fn inventory( +pub async fn inventory( data: HashMap, state: State<'_, Mutex>, ) -> Result<(), ()> { @@ -137,7 +60,7 @@ async fn inventory( } #[tauri::command] -async fn swap( +pub async fn swap( store: &str, acc: i64, state: State<'_, Mutex>, @@ -159,7 +82,7 @@ async fn swap( } #[tauri::command] -async fn count(state: State<'_, Mutex>) -> Result { +pub async fn count(state: State<'_, Mutex>) -> Result { let state = state.lock().await; let mut stmt = state.db.prepare("SELECT COUNT(*) FROM swap") @@ -176,25 +99,3 @@ async fn count(state: State<'_, Mutex>) -> Result { let cnt: u64 = row.get(0).map_err(|e| println!("{:?}", e))?; Ok(cnt.to_string()) } - -pub fn run() { - let state = AppState::new(); - tauri::Builder::default() - .plugin(tauri_plugin_fs::init()) - .setup(|app| { - app.manage(Mutex::new(state)); - let scope = app.fs_scope(); - let path = app.path(); - scope.allow_directory(path.temp_dir()?, false)?; - Ok(()) - }) - .invoke_handler(tauri::generate_handler![ - swap, - count, - inventory, - data_door::pull_data, - data_door::push_data, - ]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} diff --git a/src/types.rs b/src/types.rs new file mode 100644 index 0000000..eb4ac68 --- /dev/null +++ b/src/types.rs @@ -0,0 +1,84 @@ +#[cfg(feature = "server")] +use rusqlite::{types::ToSqlOutput, ToSql}; +use serde::{Serialize, Deserialize}; + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum Store { + Aldi, + Edeka, + Dm, + Lidl, + Rewe, + Tegut, +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum Account { + Sumpf, + Heinersyndikat, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Inventory { + pub acc: Account, + pub cash: i64, + pub vouchers: Vec, +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub struct VoucherInventory { + pub store: Store, + pub count: i64, +} + +impl TryFrom<&str> for Store { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "aldi" => Ok(Store::Aldi), + "edeka" => Ok(Store::Edeka), + "dm" => Ok(Store::Dm), + "lidl" => Ok(Store::Lidl), + "rewe" => Ok(Store::Rewe), + "tegut" => Ok(Store::Tegut), + _ => Err(()), + } + } +} + +impl TryFrom<&str> for Account { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "sumpf" => Ok(Account::Sumpf), + "hs" => Ok(Account::Heinersyndikat), + _ => Err(()), + } + } +} + +#[cfg(feature = "server")] +impl ToSql for Store { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Store::Aldi => 0.to_sql(), + Store::Edeka => 1.to_sql(), + Store::Dm => 2.to_sql(), + Store::Lidl => 3.to_sql(), + Store::Rewe => 4.to_sql(), + Store::Tegut => 5.to_sql(), + } + } +} + +#[cfg(feature = "server")] +impl ToSql for Account { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Account::Sumpf => 0.to_sql(), + Account::Heinersyndikat => 1.to_sql(), + } + } +} diff --git a/trunk.html b/trunk.html index 5562473..b03c4b3 100644 --- a/trunk.html +++ b/trunk.html @@ -3,6 +3,7 @@ + Darmstadt sagt Nein zur Bezahlkartei! From 8a25a5fa82e3859a1692b216a4ed10a9bb830261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Sat, 22 Feb 2025 16:00:00 +0100 Subject: [PATCH 04/21] Lotsa Leptos --- src/bin/leptos.rs | 96 +++++++++++++++++++++++++++++++++++++++++------ src/commands.rs | 7 ++-- src/server/mod.rs | 6 +-- src/types.rs | 22 +++++++++++ styles.scss | 3 +- 5 files changed, 115 insertions(+), 19 deletions(-) diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs index 4737730..37200df 100644 --- a/src/bin/leptos.rs +++ b/src/bin/leptos.rs @@ -5,31 +5,105 @@ use leptos::task::spawn_local; use bkbh_lib::types::*; #[component] -fn SwapButton(store: Store, img_path: &'static str, pretty: &'static str) -> impl IntoView { +fn StoreLogo(store: Store) -> impl IntoView { + view! { + ::into(&store)) + class="logo" + // FIXME: Implement fmt trait for Store + alt=format!("{:?}", store) + /> + } +} + +#[component] +fn SwapButton(store: Store) -> impl IntoView { view! { } } +#[component] +fn StoreInput(store: Store) -> impl IntoView { + let txt = format!("{}", Into::::into(&store)); + view! { +
+ + +
+ } +} + +#[component] +fn AccRadio(acc: Account) -> impl IntoView { + let txt = format!("{}", Into::::into(&acc)); + let id = format!("acc-{}", txt); + view! { +
+ + +
+ } +} + +#[component] +fn InvForm() -> impl IntoView { + view! { +
+ + + + + + + + + } +} + fn main() { console_error_panic_hook::set_once(); leptos::mount::mount_to_body(|| view! { +
+ +
}); } diff --git a/src/commands.rs b/src/commands.rs index d6e13ed..ee27cf3 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,12 +1,13 @@ use tauri_sys::Error; use tauri_sys::core::invoke; +use crate::types::*; #[derive(serde::Serialize)] -pub struct Swap<'a> { - store: &'a str, +pub struct Swap { + store: Store, acc: i64, } -pub async fn swap(store: &str, acc: i64) -> Result<(), Error> { +pub async fn swap(store: Store, acc: i64) -> Result<(), Error> { let args = Swap { store, acc }; invoke("swap", &args).await } diff --git a/src/server/mod.rs b/src/server/mod.rs index 1595f83..56072e3 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,8 +1,7 @@ use chrono::offset::Utc; -use rusqlite::{types::ToSqlOutput, ToSql}; use std::collections::HashMap; use tokio::sync::Mutex; -use tauri::{Manager, State}; +use tauri::State; use crate::types::*; @@ -61,12 +60,11 @@ pub async fn inventory( #[tauri::command] pub async fn swap( - store: &str, + store: Store, acc: i64, state: State<'_, Mutex>, ) -> Result<(), ()> { let state = state.lock().await; - let store: Store = store.try_into()?; state.db.execute( "INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5)", ( diff --git a/src/types.rs b/src/types.rs index eb4ac68..d774769 100644 --- a/src/types.rs +++ b/src/types.rs @@ -31,6 +31,19 @@ pub struct VoucherInventory { pub count: i64, } +impl Into for &Store { + fn into(self) -> String { + String::from(match *self { + Store::Aldi => "aldi", + Store::Edeka => "edeka", + Store::Dm => "dm", + Store::Lidl => "lidl", + Store::Rewe => "rewe", + Store::Tegut => "tegut", + }) + } +} + impl TryFrom<&str> for Store { type Error = (); @@ -59,6 +72,15 @@ impl TryFrom<&str> for Account { } } +impl Into for &Account { + fn into(self) -> String { + String::from(match *self { + Account::Sumpf => "sumpf", + Account::Heinersyndikat => "hs", + }) + } +} + #[cfg(feature = "server")] impl ToSql for Store { fn to_sql(&self) -> rusqlite::Result> { diff --git a/styles.scss b/styles.scss index d239b06..645a0ee 100644 --- a/styles.scss +++ b/styles.scss @@ -106,7 +106,8 @@ input[type=number] { } input[type=radio] { - height: 60%; + width: 100%; + height: 7mm; } button:hover { From 18814f18e01a1cab1a72cbd0a14e036d8273108c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 26 Feb 2025 07:28:13 +0100 Subject: [PATCH 05/21] Add Cash --- Cargo.lock | 37 ++++++++++++++++++++++ Cargo.toml | 1 + src/bin/leptos.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++-- src/commands.rs | 10 ++++++ src/server/mod.rs | 1 + 5 files changed, 127 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df3aedb..87e1aa5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,6 +353,7 @@ dependencies = [ "console_error_panic_hook", "curl", "leptos", + "leptos_router", "openssl", "rand 0.8.5", "ring-compat", @@ -2533,6 +2534,42 @@ dependencies = [ "uuid", ] +[[package]] +name = "leptos_router" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83cf6033f987f366be6ffa556ee22fa6f9f433cbffd173826fd67327c3ae7ed" +dependencies = [ + "any_spawner", + "either_of", + "futures", + "gloo-net", + "js-sys", + "leptos", + "leptos_router_macro", + "once_cell", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "thiserror 2.0.11", + "url", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_router_macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f580227933b49028cd3b6d7cd29ab7c6d30f9777cf0ac774eda2aab000a912" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "leptos_server" version = "0.7.7" diff --git a/Cargo.toml b/Cargo.toml index cceaad0..abaf228 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ tauri-build = { version = "2", features = [] } [dependencies] leptos = { version = "^0.7", features = ["csr"] } +leptos_router = { version = "^0.7" } tauri-sys = { path = "../tauri-sys", features = ["core"] } serde = { version = "1", features = ["derive"] } serde_json = { version = "1" } diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs index 37200df..fbe40b0 100644 --- a/src/bin/leptos.rs +++ b/src/bin/leptos.rs @@ -1,6 +1,9 @@ use leptos::prelude::*; use bkbh_lib::commands::*; use leptos::task::spawn_local; +use leptos::web_sys::FormData; +use leptos::form::FromFormData; +use std::collections::HashMap; use bkbh_lib::types::*; @@ -54,6 +57,58 @@ fn StoreInput(store: Store) -> impl IntoView { } } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct Cash(i64); + +impl std::str::FromStr for Cash { + type Err = (); + + fn from_str(s: &str) -> Result { + let split: Vec<&str> = s.split(".").collect(); + let i = i64::from_str(split.get(0).ok_or(())?) + .map_err(|e| println!("{:?}", e))?; + let f = match split.get(1) { + None => 0, + Some(fs) => i64::from_str( + &format!("00{}", fs)[0..2] + ) + .map_err(|e| println!("{:?}", e))?, + }; + Ok(Cash(i*100+f)) + } +} + +#[component] +fn CashInput(value: RwSignal) -> impl IntoView { + let txt = "cash"; + view! { +
+ + +
+ } +} + #[component] fn AccRadio(acc: Account) -> impl IntoView { let txt = format!("{}", Into::::into(&acc)); @@ -80,9 +135,28 @@ fn AccRadio(acc: Account) -> impl IntoView { } #[component] -fn InvForm() -> impl IntoView { +fn SubmitButton() -> impl IntoView { view! { -
+ + } +} + +#[component] +fn InvForm() -> impl IntoView { + let cash = RwSignal::new(String::from("0.00")); + view! { + @@ -90,6 +164,8 @@ fn InvForm() -> impl IntoView { + + } } diff --git a/src/commands.rs b/src/commands.rs index ee27cf3..77f271c 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,6 +1,7 @@ use tauri_sys::Error; use tauri_sys::core::invoke; use crate::types::*; +use std::collections::HashMap; #[derive(serde::Serialize)] pub struct Swap { @@ -11,3 +12,12 @@ pub async fn swap(store: Store, acc: i64) -> Result<(), Error> { let args = Swap { store, acc }; invoke("swap", &args).await } + +#[derive(serde::Serialize)] +pub struct Inventory { + data: HashMap, +} +pub async fn inventory(data: HashMap) -> Result<(), Error> { + let args = Inventory { data }; + invoke("inventory", &args).await +} diff --git a/src/server/mod.rs b/src/server/mod.rs index 56072e3..87cf516 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -40,6 +40,7 @@ pub async fn inventory( data: HashMap, state: State<'_, Mutex>, ) -> Result<(), ()> { + println!("{:?}", data); let now = Utc::now().timestamp(); let state = state.lock().await; let inv = parse_inventory(data)?; From 99f20ae465045d77e70507cef5a7703a8d51ccc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 26 Feb 2025 11:34:11 +0100 Subject: [PATCH 06/21] Run instructions --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 4a8937b..155b6e1 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,30 @@ git restore gen/android/app/build.gradle.kts cargo tauri img/icon.svg # Set up gen/android/keystore.properties ``` + +# Run + +## Linux Development + +Tauri does not seem to support +specifying the binary +to be run in a config, +so we have to do it +on the command line. + +```bash +cargo tauri dev -- --bin tauri +``` + +## Android Development + +Tauri does not seem to support +specifying the Cargo features +of the library for mobile +in a config, +so we have to do it +on the command line. + +```bash +NDK_HOME= ANDROID_HOME= cargo tauri android dev --features tauri +``` From f18a3609820911602450a7b813a2c20db9d98661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Tue, 4 Mar 2025 16:44:41 +0100 Subject: [PATCH 07/21] Move tauri-sys to proper repo --- Cargo.lock | 51 ++++++++++++++++++++++++++------------------------- Cargo.toml | 2 +- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 87e1aa5..d9ed418 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,7 +73,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41058deaa38c9d9dd933d6d238d825227cffa668e2839b52879f6619c63eee3b" dependencies = [ "futures", - "thiserror 2.0.11", + "thiserror 2.0.12", "wasm-bindgen-futures", ] @@ -516,7 +516,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -630,7 +630,7 @@ checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" dependencies = [ "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -2458,7 +2458,7 @@ dependencies = [ "server_fn", "slotmap", "tachys", - "thiserror 2.0.11", + "thiserror 2.0.12", "throw_error", "typed-builder", "typed-builder-macro", @@ -2475,7 +2475,7 @@ dependencies = [ "config", "regex", "serde", - "thiserror 2.0.11", + "thiserror 2.0.12", "typed-builder", ] @@ -2552,7 +2552,7 @@ dependencies = [ "reactive_graph", "send_wrapper", "tachys", - "thiserror 2.0.11", + "thiserror 2.0.12", "url", "wasm-bindgen", "web-sys", @@ -3835,7 +3835,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", ] @@ -3854,7 +3854,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.11", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -4009,7 +4009,7 @@ dependencies = [ "send_wrapper", "serde", "slotmap", - "thiserror 2.0.11", + "thiserror 2.0.12", "web-sys", ] @@ -4069,7 +4069,7 @@ checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4191,7 +4191,7 @@ dependencies = [ "quote", "syn 2.0.98", "syn_derive", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4579,7 +4579,7 @@ dependencies = [ "serde_json", "serde_qs", "server_fn_macro_default", - "thiserror 2.0.11", + "thiserror 2.0.12", "throw_error", "url", "wasm-bindgen", @@ -5023,7 +5023,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tray-icon", "url", @@ -5076,7 +5076,7 @@ dependencies = [ "sha2", "syn 2.0.98", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.12", "time", "url", "uuid", @@ -5131,7 +5131,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.12", "toml 0.8.20", "url", "uuid", @@ -5153,7 +5153,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.11", + "thiserror 2.0.12", "url", "windows", "zbus", @@ -5173,7 +5173,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.12", "url", "windows", ] @@ -5207,6 +5207,7 @@ dependencies = [ [[package]] name = "tauri-sys" version = "0.2.0" +source = "git+ssh://git@gitea.mathebau.de:3022/Peter/tauri-sys.git?branch=v2#1cf83b65dfbf51a7dfd63821867a9356b3f61416" dependencies = [ "derive_more", "futures", @@ -5249,7 +5250,7 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.11", + "thiserror 2.0.12", "toml 0.8.20", "url", "urlpattern", @@ -5309,11 +5310,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -5329,9 +5330,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -5587,7 +5588,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror 2.0.11", + "thiserror 2.0.12", "windows-sys 0.59.0", ] @@ -6473,7 +6474,7 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.11", + "thiserror 2.0.12", "url", "webkit2gtk", "webkit2gtk-sys", diff --git a/Cargo.toml b/Cargo.toml index abaf228..328510e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ tauri-build = { version = "2", features = [] } [dependencies] leptos = { version = "^0.7", features = ["csr"] } leptos_router = { version = "^0.7" } -tauri-sys = { path = "../tauri-sys", features = ["core"] } +tauri-sys = { git = "ssh://git@gitea.mathebau.de:3022/Peter/tauri-sys.git", branch = "v2", features = ["core"] } serde = { version = "1", features = ["derive"] } serde_json = { version = "1" } From 185fd938c18ae63050a4c23b78397370691d22bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 00:34:23 +0100 Subject: [PATCH 08/21] Refactor a bit --- Cargo.toml | 7 +- src/bin/leptos.rs | 184 +-------------------------------------------- src/bin/tauri.rs | 2 +- src/leptos/cafe.rs | 184 +++++++++++++++++++++++++++++++++++++++++++++ src/leptos/mod.rs | 1 + src/lib.rs | 2 + trunk.html | 2 +- 7 files changed, 194 insertions(+), 188 deletions(-) create mode 100644 src/leptos/cafe.rs create mode 100644 src/leptos/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 328510e..7e55a1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,13 +21,8 @@ server = [ "dep:ring-compat", ] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [lib] -# The `_lib` suffix may seem redundant but it is necessary -# to make the lib name unique and wouldn't conflict with the bin name. -# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 -name = "bkbh_lib" +name = "bkbh" crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs index fbe40b0..ceaf345 100644 --- a/src/bin/leptos.rs +++ b/src/bin/leptos.rs @@ -1,185 +1,9 @@ use leptos::prelude::*; -use bkbh_lib::commands::*; -use leptos::task::spawn_local; -use leptos::web_sys::FormData; -use leptos::form::FromFormData; -use std::collections::HashMap; - -use bkbh_lib::types::*; - -#[component] -fn StoreLogo(store: Store) -> impl IntoView { - view! { - ::into(&store)) - class="logo" - // FIXME: Implement fmt trait for Store - alt=format!("{:?}", store) - /> - } -} - -#[component] -fn SwapButton(store: Store) -> impl IntoView { - view! { - - } -} - -#[component] -fn StoreInput(store: Store) -> impl IntoView { - let txt = format!("{}", Into::::into(&store)); - view! { -
- - -
- } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -struct Cash(i64); - -impl std::str::FromStr for Cash { - type Err = (); - - fn from_str(s: &str) -> Result { - let split: Vec<&str> = s.split(".").collect(); - let i = i64::from_str(split.get(0).ok_or(())?) - .map_err(|e| println!("{:?}", e))?; - let f = match split.get(1) { - None => 0, - Some(fs) => i64::from_str( - &format!("00{}", fs)[0..2] - ) - .map_err(|e| println!("{:?}", e))?, - }; - Ok(Cash(i*100+f)) - } -} - -#[component] -fn CashInput(value: RwSignal) -> impl IntoView { - let txt = "cash"; - view! { -
- - -
- } -} - -#[component] -fn AccRadio(acc: Account) -> impl IntoView { - let txt = format!("{}", Into::::into(&acc)); - let id = format!("acc-{}", txt); - view! { -
- - -
- } -} - -#[component] -fn SubmitButton() -> impl IntoView { - view! { - - } -} - -#[component] -fn InvForm() -> impl IntoView { - let cash = RwSignal::new(String::from("0.00")); - view! { -
- - - - - - - - - - - } -} +use bkbh::leptos::cafe::Cafe; fn main() { console_error_panic_hook::set_once(); - leptos::mount::mount_to_body(|| view! { - -
- -
- }); + leptos::mount::mount_to_body( + || view! { } + ); } diff --git a/src/bin/tauri.rs b/src/bin/tauri.rs index 4d73f4d..3d19dcc 100644 --- a/src/bin/tauri.rs +++ b/src/bin/tauri.rs @@ -2,5 +2,5 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { - bkbh_lib::run() + bkbh::run() } diff --git a/src/leptos/cafe.rs b/src/leptos/cafe.rs new file mode 100644 index 0000000..5137ce1 --- /dev/null +++ b/src/leptos/cafe.rs @@ -0,0 +1,184 @@ +use leptos::prelude::*; +use crate::commands::*; +use leptos::task::spawn_local; +use leptos::web_sys::FormData; +use leptos::form::FromFormData; +use std::collections::HashMap; +use crate::types::*; + +#[component] +pub fn Cafe() -> impl IntoView { + view! { + +
+ +
+ } +} + +#[component] +fn StoreLogo(store: Store) -> impl IntoView { + view! { + ::into(&store)) + class="logo" + // FIXME: Implement fmt trait for Store + alt=format!("{:?}", store) + /> + } +} + +#[component] +fn SwapButton(store: Store) -> impl IntoView { + view! { + + } +} + +#[component] +fn StoreInput(store: Store) -> impl IntoView { + let txt = format!("{}", Into::::into(&store)); + view! { +
+ + +
+ } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct Cash(i64); + +impl std::str::FromStr for Cash { + type Err = (); + + fn from_str(s: &str) -> Result { + let split: Vec<&str> = s.split(".").collect(); + let i = i64::from_str(split.get(0).ok_or(())?) + .map_err(|e| println!("{:?}", e))?; + let f = match split.get(1) { + None => 0, + Some(fs) => i64::from_str( + &format!("00{}", fs)[0..2] + ) + .map_err(|e| println!("{:?}", e))?, + }; + Ok(Cash(i*100+f)) + } +} + +#[component] +fn CashInput(value: RwSignal) -> impl IntoView { + let txt = "cash"; + view! { +
+ + +
+ } +} + +#[component] +fn AccRadio(acc: Account) -> impl IntoView { + let txt = format!("{}", Into::::into(&acc)); + let id = format!("acc-{}", txt); + view! { +
+ + +
+ } +} + +#[component] +fn SubmitButton() -> impl IntoView { + view! { + + } +} + +#[component] +fn InvForm() -> impl IntoView { + let cash = RwSignal::new(String::from("0.00")); + view! { +
+ + + + + + + + + + + } +} diff --git a/src/leptos/mod.rs b/src/leptos/mod.rs new file mode 100644 index 0000000..1c34313 --- /dev/null +++ b/src/leptos/mod.rs @@ -0,0 +1 @@ +pub mod cafe; diff --git a/src/lib.rs b/src/lib.rs index 366d39a..3340bcd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ pub mod commands; #[cfg(feature = "server")] pub mod server; +#[cfg(feature = "leptos")] +pub mod leptos; pub mod types; #[cfg(all(feature = "tauri", feature="server"))] diff --git a/trunk.html b/trunk.html index b03c4b3..26d67d9 100644 --- a/trunk.html +++ b/trunk.html @@ -6,7 +6,7 @@ Darmstadt sagt Nein zur Bezahlkartei! - + From 9e49770b9942e0243676110d40d05762158ecb95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 02:04:26 +0100 Subject: [PATCH 09/21] Ignore secret --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index cc1a33d..72ac06a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ icons/ # Generated by Trunk # will have the files to be served over http www/ + +# Secret +src/server/cloud_user.txt From 7cc7f03e5c1a89b1bda09b64185caa69abc812dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 03:14:04 +0100 Subject: [PATCH 10/21] More swap buttons again --- src/leptos/cafe.rs | 65 ++++++++++++++++++++++++++-------------------- src/types.rs | 30 +++++++++++++++++++++ 2 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/leptos/cafe.rs b/src/leptos/cafe.rs index 5137ce1..db7a184 100644 --- a/src/leptos/cafe.rs +++ b/src/leptos/cafe.rs @@ -8,14 +8,45 @@ use crate::types::*; #[component] pub fn Cafe() -> impl IntoView { + let acc = signal(Account::Sumpf); view! { - + } +} + +#[component] +fn Reception(acc: ReadSignal) -> impl IntoView { + view! {
- +

+ {move || format!("{}", acc.get())} +

+
+ + + + + + +
} } @@ -26,7 +57,7 @@ fn StoreLogo(store: Store) -> impl IntoView { ::into(&store)) class="logo" - // FIXME: Implement fmt trait for Store + // FIXME: Implement fmt::Display for Store alt=format!("{:?}", store) /> } @@ -70,27 +101,6 @@ fn StoreInput(store: Store) -> impl IntoView { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -struct Cash(i64); - -impl std::str::FromStr for Cash { - type Err = (); - - fn from_str(s: &str) -> Result { - let split: Vec<&str> = s.split(".").collect(); - let i = i64::from_str(split.get(0).ok_or(())?) - .map_err(|e| println!("{:?}", e))?; - let f = match split.get(1) { - None => 0, - Some(fs) => i64::from_str( - &format!("00{}", fs)[0..2] - ) - .map_err(|e| println!("{:?}", e))?, - }; - Ok(Cash(i*100+f)) - } -} - #[component] fn CashInput(value: RwSignal) -> impl IntoView { let txt = "cash"; @@ -140,8 +150,7 @@ fn AccRadio(acc: Account) -> impl IntoView { } diff --git a/src/types.rs b/src/types.rs index d774769..fd2815b 100644 --- a/src/types.rs +++ b/src/types.rs @@ -31,6 +31,27 @@ pub struct VoucherInventory { pub count: i64, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct Cash(i64); + +impl std::str::FromStr for Cash { + type Err = (); + + fn from_str(s: &str) -> Result { + let split: Vec<&str> = s.split(".").collect(); + let i = i64::from_str(split.get(0).ok_or(())?) + .map_err(|e| println!("{:?}", e))?; + let f = match split.get(1) { + None => 0, + Some(fs) => i64::from_str( + &format!("00{}", fs)[0..2] + ) + .map_err(|e| println!("{:?}", e))?, + }; + Ok(Cash(i*100+f)) + } +} + impl Into for &Store { fn into(self) -> String { String::from(match *self { @@ -81,6 +102,15 @@ impl Into for &Account { } } +impl std::fmt::Display for Account { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match *self { + Account::Sumpf => "Sumpf", + Account::Heinersyndikat => "Heinersyndikat", + }.fmt(f) + } +} + #[cfg(feature = "server")] impl ToSql for Store { fn to_sql(&self) -> rusqlite::Result> { From eda34db5081467acbcb82d202d3ce93d6d62a7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 20:05:46 +0100 Subject: [PATCH 11/21] Refactor --- src/leptos/angel.rs | 8 ++++++++ src/leptos/cafe.rs | 17 +++-------------- src/leptos/mod.rs | 2 ++ src/leptos/store.rs | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 src/leptos/angel.rs create mode 100644 src/leptos/store.rs diff --git a/src/leptos/angel.rs b/src/leptos/angel.rs new file mode 100644 index 0000000..ae56667 --- /dev/null +++ b/src/leptos/angel.rs @@ -0,0 +1,8 @@ +use leptos::prelude::*; + +#[component] +pub fn Angel() -> impl IntoView { + view! { +

Hi

+ } +} diff --git a/src/leptos/cafe.rs b/src/leptos/cafe.rs index db7a184..38c3e78 100644 --- a/src/leptos/cafe.rs +++ b/src/leptos/cafe.rs @@ -13,6 +13,7 @@ pub fn Cafe() -> impl IntoView { + } } @@ -51,18 +52,6 @@ fn Reception(acc: ReadSignal) -> impl IntoView { } } -#[component] -fn StoreLogo(store: Store) -> impl IntoView { - view! { - ::into(&store)) - class="logo" - // FIXME: Implement fmt::Display for Store - alt=format!("{:?}", store) - /> - } -} - #[component] fn SwapButton(store: Store) -> impl IntoView { view! { @@ -74,7 +63,7 @@ fn SwapButton(store: Store) -> impl IntoView { } class="column" > - + } } @@ -89,7 +78,7 @@ fn StoreInput(store: Store) -> impl IntoView { impl IntoView { + view! { + ::into(&store)) + class="logo" + // FIXME: Implement fmt::Display for Store + alt=format!("{:?}", store) + /> + } +} From be9b5ed8553e39a1175b2ee4670b50c14d7efcaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 20:15:11 +0100 Subject: [PATCH 12/21] Fmt --- leptosfmt.toml | 4 ++++ rust-analyzer.toml | 2 ++ rustfmt.toml | 5 +++-- src/bin/leptos.rs | 6 ++---- src/commands.rs | 4 ++-- src/leptos/cafe.rs | 6 +++--- src/leptos/mod.rs | 2 +- src/leptos/store.rs | 2 +- src/lib.rs | 8 ++++---- src/server/data_door.rs | 21 ++++++++++----------- src/server/mod.rs | 15 +++++---------- src/types.rs | 13 ++++++------- 12 files changed, 43 insertions(+), 45 deletions(-) create mode 100644 leptosfmt.toml create mode 100644 rust-analyzer.toml diff --git a/leptosfmt.toml b/leptosfmt.toml new file mode 100644 index 0000000..10c879c --- /dev/null +++ b/leptosfmt.toml @@ -0,0 +1,4 @@ +max_width = 80 +tab_spaces = 8 +indentation_style = "Tabs" +newline_style = "Unix" diff --git a/rust-analyzer.toml b/rust-analyzer.toml new file mode 100644 index 0000000..9eab123 --- /dev/null +++ b/rust-analyzer.toml @@ -0,0 +1,2 @@ +[rustfmt] +overrideCommand = ["leptosfmt", "--stdin", "--rustfmt"] diff --git a/rustfmt.toml b/rustfmt.toml index f4b1b83..82ce7eb 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,3 +1,4 @@ -max_width = 80 -hard_tabs = true +edition = "2024" +max_width = 80 +hard_tabs = true tab_spaces = 8 diff --git a/src/bin/leptos.rs b/src/bin/leptos.rs index ceaf345..69fd0a8 100644 --- a/src/bin/leptos.rs +++ b/src/bin/leptos.rs @@ -1,9 +1,7 @@ -use leptos::prelude::*; use bkbh::leptos::cafe::Cafe; +use leptos::prelude::*; fn main() { console_error_panic_hook::set_once(); - leptos::mount::mount_to_body( - || view! { } - ); + leptos::mount::mount_to_body(|| view! { }); } diff --git a/src/commands.rs b/src/commands.rs index 77f271c..10fcf06 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,7 +1,7 @@ -use tauri_sys::Error; -use tauri_sys::core::invoke; use crate::types::*; use std::collections::HashMap; +use tauri_sys::core::invoke; +use tauri_sys::Error; #[derive(serde::Serialize)] pub struct Swap { diff --git a/src/leptos/cafe.rs b/src/leptos/cafe.rs index 38c3e78..ab02620 100644 --- a/src/leptos/cafe.rs +++ b/src/leptos/cafe.rs @@ -1,10 +1,10 @@ -use leptos::prelude::*; use crate::commands::*; +use crate::types::*; +use leptos::form::FromFormData; +use leptos::prelude::*; use leptos::task::spawn_local; use leptos::web_sys::FormData; -use leptos::form::FromFormData; use std::collections::HashMap; -use crate::types::*; #[component] pub fn Cafe() -> impl IntoView { diff --git a/src/leptos/mod.rs b/src/leptos/mod.rs index ef74328..016f94c 100644 --- a/src/leptos/mod.rs +++ b/src/leptos/mod.rs @@ -1,3 +1,3 @@ -pub mod cafe; pub mod angel; +pub mod cafe; pub mod store; diff --git a/src/leptos/store.rs b/src/leptos/store.rs index 9ef8ca7..d33f7ca 100644 --- a/src/leptos/store.rs +++ b/src/leptos/store.rs @@ -1,5 +1,5 @@ -use leptos::prelude::*; use crate::types::*; +use leptos::prelude::*; #[component] pub fn Logo(store: Store) -> impl IntoView { diff --git a/src/lib.rs b/src/lib.rs index 3340bcd..ef98862 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,16 @@ pub mod commands; -#[cfg(feature = "server")] -pub mod server; #[cfg(feature = "leptos")] pub mod leptos; +#[cfg(feature = "server")] +pub mod server; pub mod types; -#[cfg(all(feature = "tauri", feature="server"))] +#[cfg(all(feature = "tauri", feature = "server"))] #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { + use server::app_state::AppState; use tauri::{Manager, State}; use tauri_plugin_fs::FsExt; - use server::app_state::AppState; use tokio::sync::Mutex; let state = AppState::new(); diff --git a/src/server/data_door.rs b/src/server/data_door.rs index 555c9ac..ad8844c 100644 --- a/src/server/data_door.rs +++ b/src/server/data_door.rs @@ -1,8 +1,8 @@ use chrono::offset::Utc; use curl::{easy, easy::Easy2}; use rand::prelude::*; -use rusqlite::{Connection, DatabaseName}; use ring_compat::signature::ed25519::SigningKey; +use rusqlite::{Connection, DatabaseName}; use tauri::{Manager, State}; use tokio::sync::Mutex; @@ -62,7 +62,8 @@ fn data_client(file: &str) -> Result, ()> { file ); client.url(&url).map_err(|_| ())?; - client.username(include_str!("cloud_user.txt")).map_err(|_| ())?; + client.username(include_str!("cloud_user.txt")) + .map_err(|_| ())?; client.http_auth(easy::Auth::new().auto(true)) .map_err(|_| ())?; client.ssl_cainfo_blob(include_bytes!("isrg-root-x1.pem")) @@ -76,8 +77,7 @@ fn put_client(file: &str, payload: &[u8]) -> Result, ()> { client.get_mut().1.extend_from_slice(payload); client.in_filesize(payload.len() as u64) .map_err(|e| println!("{:?}", e))?; - client.upload(true) - .map_err(|e| println!("{:?}", e))?; + client.upload(true).map_err(|e| println!("{:?}", e))?; Ok(client) } @@ -96,22 +96,21 @@ async fn push_key(id: &u64, key: &SigningKey) -> Result<(), ()> { let file = format!("{:016X}.key", id); let v_key = key.verifying_key(); let client = put_client(&file, v_key.as_ref())?; - let _perf = client.perform() - .map_err(|e| println!("{:?}", e))?; + let _perf = client.perform().map_err(|e| println!("{:?}", e))?; Ok(()) } fn push_db(id: &u64, db: &Connection, app: tauri::AppHandle) -> Result<(), ()> { let filename = format!("{:016X}.sqlite", id); - let path = app.path().resolve(&filename, tauri::path::BaseDirectory::Temp) + let path = app + .path() + .resolve(&filename, tauri::path::BaseDirectory::Temp) .map_err(|e| println!("{:?}", e))?; db.backup(DatabaseName::Main, &path, None) .map_err(|e| println!("{:?}", e))?; - let buf = std::fs::read(&path) - .map_err(|e| println!("{:?}", e))?; + let buf = std::fs::read(&path).map_err(|e| println!("{:?}", e))?; let client = put_client(&filename, buf.as_ref())?; - let _perf = client.perform() - .map_err(|e| println!("{:?}", e))?; + let _perf = client.perform().map_err(|e| println!("{:?}", e))?; Ok(()) } diff --git a/src/server/mod.rs b/src/server/mod.rs index 87cf516..27a877c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,7 +1,7 @@ use chrono::offset::Utc; use std::collections::HashMap; -use tokio::sync::Mutex; use tauri::State; +use tokio::sync::Mutex; use crate::types::*; @@ -22,14 +22,14 @@ fn parse_inventory(data: HashMap) -> Result { match data.get(&format!("cafe-inventory-{}", s)) { None => (), Some(c) => { - let c = if c == "" {"0"} else {c}; + let c = if c == "" { "0" } else { c }; let Ok(count) = c.parse() else { println!("Invalid count '{}' for '{}' in inventory data.", c, s); continue; }; let v = VoucherInventory { store, count }; vouchers.push(v); - }, + } } } unimplemented!() @@ -47,15 +47,10 @@ pub async fn inventory( for v in inv.vouchers { state.db.execute( "INSERT INTO voucher_inventory VALUES ()", - ( - inv.acc, - v.store, - v.count, - now, - ), + (inv.acc, v.store, v.count, now), ) .map_err(|e| println!("{:?}", e))?; - }; + } Ok(()) } diff --git a/src/types.rs b/src/types.rs index fd2815b..36e0800 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,6 +1,6 @@ #[cfg(feature = "server")] use rusqlite::{types::ToSqlOutput, ToSql}; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum Store { @@ -43,12 +43,10 @@ impl std::str::FromStr for Cash { .map_err(|e| println!("{:?}", e))?; let f = match split.get(1) { None => 0, - Some(fs) => i64::from_str( - &format!("00{}", fs)[0..2] - ) - .map_err(|e| println!("{:?}", e))?, + Some(fs) => i64::from_str(&format!("00{}", fs)[0..2]) + .map_err(|e| println!("{:?}", e))?, }; - Ok(Cash(i*100+f)) + Ok(Cash(i * 100 + f)) } } @@ -107,7 +105,8 @@ impl std::fmt::Display for Account { match *self { Account::Sumpf => "Sumpf", Account::Heinersyndikat => "Heinersyndikat", - }.fmt(f) + } + .fmt(f) } } From c4ca948f8a7f2eb4a836180a661a64b803677f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 20:48:43 +0100 Subject: [PATCH 13/21] TOML formatting --- Cargo.toml | 38 +++++++++++++++++++++++--------------- Trunk.toml | 6 +++--- leptosfmt.toml | 4 ++-- rustfmt.toml | 2 +- taplo.toml | 3 +++ 5 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 taplo.toml diff --git a/Cargo.toml b/Cargo.toml index 7e55a1d..3bc958b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,11 @@ [package] +authors = ["Bianca Fürstenau"] +description = "Buchhaltung für „Darmstadt sagt Nein zur Bezahlkarte!“" +edition = "2021" name = "bkbh" version = "0.1.0" -description = "Buchhaltung für „Darmstadt sagt Nein zur Bezahlkarte!“" -authors = ["Bianca Fürstenau"] -edition = "2021" [features] -tauri = ["server"] leptos = [] server = [ "dep:tauri", @@ -20,29 +19,38 @@ server = [ "dep:openssl", "dep:ring-compat", ] +tauri = ["server"] [lib] -name = "bkbh" crate-type = ["staticlib", "cdylib", "rlib"] +name = "bkbh" [build-dependencies] tauri-build = { version = "2", features = [] } [dependencies] +console_error_panic_hook = { version = "0.1.7" } leptos = { version = "^0.7", features = ["csr"] } leptos_router = { version = "^0.7" } -tauri-sys = { git = "ssh://git@gitea.mathebau.de:3022/Peter/tauri-sys.git", branch = "v2", features = ["core"] } serde = { version = "1", features = ["derive"] } serde_json = { version = "1" } +tauri-sys = { git = "ssh://git@gitea.mathebau.de:3022/Peter/tauri-sys.git", branch = "v2", features = [ + "core", +] } +chrono = { version = "^0.4", optional = true } +curl = { version = "^0.4", optional = true } +openssl = { version = "^0.10", features = ["vendored"], optional = true } +rand = { version = "^0.8", optional = true } +ring-compat = { version = "^0.8", features = [ + "signature", + "rand_core", +], optional = true } +rusqlite = { version = "^0.33", features = [ + "backup", + "bundled", +], optional = true } tauri = { version = "2", features = [], optional = true } +tauri-plugin-fs = { version = "2", optional = true } tauri-plugin-opener = { version = "2", optional = true } -tauri-plugin-fs = {version = "2", optional = true} -rusqlite = {version = "^0.33", features = ["backup", "bundled"], optional = true } -rand = {version = "^0.8", optional = true} -chrono = {version = "^0.4", optional = true} -tokio = {version = "^1.43", optional = true} -curl = {version = "^0.4", optional = true} -openssl = {version = "^0.10", features = ["vendored"], optional = true} -ring-compat = {version = "^0.8", features = ["signature", "rand_core"], optional = true} -console_error_panic_hook = {version = "0.1.7"} +tokio = { version = "^1.43", optional = true } diff --git a/Trunk.toml b/Trunk.toml index 29257e2..4cab13b 100644 --- a/Trunk.toml +++ b/Trunk.toml @@ -1,9 +1,9 @@ [build] -target = "trunk.html" -html_output = "index.html" dist = "www" +html_output = "index.html" +target = "trunk.html" [serve] -port = 1420 open = false +port = 1420 ws_protocol = "ws" diff --git a/leptosfmt.toml b/leptosfmt.toml index 10c879c..adbe220 100644 --- a/leptosfmt.toml +++ b/leptosfmt.toml @@ -1,4 +1,4 @@ +indentation_style = "Tabs" max_width = 80 -tab_spaces = 8 -indentation_style = "Tabs" newline_style = "Unix" +tab_spaces = 8 diff --git a/rustfmt.toml b/rustfmt.toml index 82ce7eb..bfca9ce 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,4 +1,4 @@ edition = "2024" -max_width = 80 hard_tabs = true +max_width = 80 tab_spaces = 8 diff --git a/taplo.toml b/taplo.toml new file mode 100644 index 0000000..204dffa --- /dev/null +++ b/taplo.toml @@ -0,0 +1,3 @@ +[formatting] +indent_string = " " +reorder_keys = true From 36a18b962dec5d39d554e3196709eecd52a9ff7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Wed, 5 Mar 2025 20:49:08 +0100 Subject: [PATCH 14/21] Edition bump to 2024 --- Cargo.toml | 2 +- src/server/app_state.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3bc958b..64749bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["Bianca Fürstenau"] description = "Buchhaltung für „Darmstadt sagt Nein zur Bezahlkarte!“" -edition = "2021" +edition = "2024" name = "bkbh" version = "0.1.0" diff --git a/src/server/app_state.rs b/src/server/app_state.rs index f2e7ce0..df2c61a 100644 --- a/src/server/app_state.rs +++ b/src/server/app_state.rs @@ -28,7 +28,7 @@ impl AppState { .unwrap(); let mut rng = rand::thread_rng(); let last_sync = i64::MIN; - let id = rng.gen(); + let id = rng.r#gen(); let key = SigningKey::generate(&mut rng); AppState { db, From f897b1aed3eccd31b5bb6ef77a4e6764545354f7 Mon Sep 17 00:00:00 2001 From: Bianca Date: Wed, 5 Mar 2025 22:17:12 +0100 Subject: [PATCH 15/21] Improve setup instructions --- README.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 155b6e1..246b3b5 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,28 @@ # Setup + +Clone the repository +and in the root directory +of the repo, +execute: + ```bash -git clone … -cargo tauri android init -git restore gen/android/app/build.gradle.kts -cargo tauri img/icon.svg -# Set up gen/android/keystore.properties +cargo tauri icon assets/icon.svg ``` +## Android + +To enable android development, +additionally execute + +```bash +rm gen/android/app/build.gradle.kts +NDK_HOME= ANDROID_HOME= cargo tauri android init +git restore gen/android/app/build.gradle.kts +``` + +and set up `gen/android/keystore.properties`, +e.g. following https://v2.tauri.app/distribute/sign/android/. + # Run ## Linux Development From 127ccfb26b103efa5326a8532b69ca68f1458aff Mon Sep 17 00:00:00 2001 From: Bianca Date: Wed, 5 Mar 2025 23:22:40 +0100 Subject: [PATCH 16/21] Mention cloud_user in README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 246b3b5..a40414b 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,15 @@ Clone the repository and in the root directory of the repo, -execute: +execute ```bash cargo tauri icon assets/icon.svg ``` +and write the Nextcloud token +into `src/server/cloud_user.txt`. + ## Android To enable android development, From 293053134f8322ba15fb9e0ce32309cd9cf27f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Fri, 7 Mar 2025 01:41:31 +0100 Subject: [PATCH 17/21] Split up types --- src/types.rs | 135 ------------------------------------------- src/types/account.rs | 50 ++++++++++++++++ src/types/cash.rs | 23 ++++++++ src/types/mod.rs | 22 +++++++ src/types/store.rs | 56 ++++++++++++++++++ 5 files changed, 151 insertions(+), 135 deletions(-) delete mode 100644 src/types.rs create mode 100644 src/types/account.rs create mode 100644 src/types/cash.rs create mode 100644 src/types/mod.rs create mode 100644 src/types/store.rs diff --git a/src/types.rs b/src/types.rs deleted file mode 100644 index 36e0800..0000000 --- a/src/types.rs +++ /dev/null @@ -1,135 +0,0 @@ -#[cfg(feature = "server")] -use rusqlite::{types::ToSqlOutput, ToSql}; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub enum Store { - Aldi, - Edeka, - Dm, - Lidl, - Rewe, - Tegut, -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub enum Account { - Sumpf, - Heinersyndikat, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Inventory { - pub acc: Account, - pub cash: i64, - pub vouchers: Vec, -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub struct VoucherInventory { - pub store: Store, - pub count: i64, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -struct Cash(i64); - -impl std::str::FromStr for Cash { - type Err = (); - - fn from_str(s: &str) -> Result { - let split: Vec<&str> = s.split(".").collect(); - let i = i64::from_str(split.get(0).ok_or(())?) - .map_err(|e| println!("{:?}", e))?; - let f = match split.get(1) { - None => 0, - Some(fs) => i64::from_str(&format!("00{}", fs)[0..2]) - .map_err(|e| println!("{:?}", e))?, - }; - Ok(Cash(i * 100 + f)) - } -} - -impl Into for &Store { - fn into(self) -> String { - String::from(match *self { - Store::Aldi => "aldi", - Store::Edeka => "edeka", - Store::Dm => "dm", - Store::Lidl => "lidl", - Store::Rewe => "rewe", - Store::Tegut => "tegut", - }) - } -} - -impl TryFrom<&str> for Store { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "aldi" => Ok(Store::Aldi), - "edeka" => Ok(Store::Edeka), - "dm" => Ok(Store::Dm), - "lidl" => Ok(Store::Lidl), - "rewe" => Ok(Store::Rewe), - "tegut" => Ok(Store::Tegut), - _ => Err(()), - } - } -} - -impl TryFrom<&str> for Account { - type Error = (); - - fn try_from(s: &str) -> Result { - match s { - "sumpf" => Ok(Account::Sumpf), - "hs" => Ok(Account::Heinersyndikat), - _ => Err(()), - } - } -} - -impl Into for &Account { - fn into(self) -> String { - String::from(match *self { - Account::Sumpf => "sumpf", - Account::Heinersyndikat => "hs", - }) - } -} - -impl std::fmt::Display for Account { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match *self { - Account::Sumpf => "Sumpf", - Account::Heinersyndikat => "Heinersyndikat", - } - .fmt(f) - } -} - -#[cfg(feature = "server")] -impl ToSql for Store { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Store::Aldi => 0.to_sql(), - Store::Edeka => 1.to_sql(), - Store::Dm => 2.to_sql(), - Store::Lidl => 3.to_sql(), - Store::Rewe => 4.to_sql(), - Store::Tegut => 5.to_sql(), - } - } -} - -#[cfg(feature = "server")] -impl ToSql for Account { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Account::Sumpf => 0.to_sql(), - Account::Heinersyndikat => 1.to_sql(), - } - } -} diff --git a/src/types/account.rs b/src/types/account.rs new file mode 100644 index 0000000..6da16e1 --- /dev/null +++ b/src/types/account.rs @@ -0,0 +1,50 @@ +#[cfg(feature = "server")] +use rusqlite::{types::ToSqlOutput, ToSql}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum Account { + Sumpf, + Heinersyndikat, +} + +impl TryFrom<&str> for Account { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "sumpf" => Ok(Account::Sumpf), + "hs" => Ok(Account::Heinersyndikat), + _ => Err(()), + } + } +} + +impl Into for &Account { + fn into(self) -> String { + String::from(match *self { + Account::Sumpf => "sumpf", + Account::Heinersyndikat => "hs", + }) + } +} + +impl std::fmt::Display for Account { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match *self { + Account::Sumpf => "Sumpf", + Account::Heinersyndikat => "Heinersyndikat", + } + .fmt(f) + } +} + +#[cfg(feature = "server")] +impl ToSql for Account { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Account::Sumpf => 0.to_sql(), + Account::Heinersyndikat => 1.to_sql(), + } + } +} diff --git a/src/types/cash.rs b/src/types/cash.rs new file mode 100644 index 0000000..d73255e --- /dev/null +++ b/src/types/cash.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; + +/// An amount of cash, +/// measured as an integer multiple +/// of 0.01 €. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub struct Cash(i64); + +impl std::str::FromStr for Cash { + type Err = (); + + fn from_str(s: &str) -> Result { + let split: Vec<&str> = s.split(".").collect(); + let i = i64::from_str(split.get(0).ok_or(())?) + .map_err(|e| println!("{:?}", e))?; + let f = match split.get(1) { + None => 0, + Some(fs) => i64::from_str(&format!("00{}", fs)[0..2]) + .map_err(|e| println!("{:?}", e))?, + }; + Ok(Cash(i * 100 + f)) + } +} \ No newline at end of file diff --git a/src/types/mod.rs b/src/types/mod.rs new file mode 100644 index 0000000..0fa5794 --- /dev/null +++ b/src/types/mod.rs @@ -0,0 +1,22 @@ +use serde::{Deserialize, Serialize}; + +mod store; +mod account; +mod cash; + +pub use store::Store; +pub use account::Account; +pub use cash::Cash; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Inventory { + pub acc: Account, + pub cash: Cash, + pub vouchers: Vec, +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub struct VoucherInventory { + pub store: Store, + pub count: i64, +} diff --git a/src/types/store.rs b/src/types/store.rs new file mode 100644 index 0000000..cd0fe30 --- /dev/null +++ b/src/types/store.rs @@ -0,0 +1,56 @@ +#[cfg(feature = "server")] +use rusqlite::{types::ToSqlOutput, ToSql}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum Store { + Aldi, + Edeka, + Dm, + Lidl, + Rewe, + Tegut, +} + +impl Into for &Store { + fn into(self) -> String { + String::from(match *self { + Store::Aldi => "aldi", + Store::Edeka => "edeka", + Store::Dm => "dm", + Store::Lidl => "lidl", + Store::Rewe => "rewe", + Store::Tegut => "tegut", + }) + } +} + +impl TryFrom<&str> for Store { + type Error = (); + + fn try_from(s: &str) -> Result { + match s { + "aldi" => Ok(Store::Aldi), + "edeka" => Ok(Store::Edeka), + "dm" => Ok(Store::Dm), + "lidl" => Ok(Store::Lidl), + "rewe" => Ok(Store::Rewe), + "tegut" => Ok(Store::Tegut), + _ => Err(()), + } + } +} + +#[cfg(feature = "server")] +impl ToSql for Store { + fn to_sql(&self) -> rusqlite::Result> { + match self { + Store::Aldi => 0.to_sql(), + Store::Edeka => 1.to_sql(), + Store::Dm => 2.to_sql(), + Store::Lidl => 3.to_sql(), + Store::Rewe => 4.to_sql(), + Store::Tegut => 5.to_sql(), + } + } +} From 7fc710d4f57991fd17b00c539b9890239bda213e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Fri, 7 Mar 2025 01:44:50 +0100 Subject: [PATCH 18/21] More error reporting --- src/server/data_door.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/server/data_door.rs b/src/server/data_door.rs index ad8844c..c1b2154 100644 --- a/src/server/data_door.rs +++ b/src/server/data_door.rs @@ -61,19 +61,21 @@ fn data_client(file: &str) -> Result, ()> { "https://cloud.seebruecke.org/public.php/webdav/data/{}", file ); - client.url(&url).map_err(|_| ())?; + client.url(&url) + .map_err(|e| println!("{:?}", e))?; client.username(include_str!("cloud_user.txt")) - .map_err(|_| ())?; + .map_err(|e| println!("{:?}", e))?; client.http_auth(easy::Auth::new().auto(true)) - .map_err(|_| ())?; + .map_err(|e| println!("{:?}", e))?; client.ssl_cainfo_blob(include_bytes!("isrg-root-x1.pem")) - .map_err(|_| ())?; + .map_err(|e| println!("{:?}", e))?; Ok(client) } fn put_client(file: &str, payload: &[u8]) -> Result, ()> { let mut client = data_client(&file)?; - client.put(true).map_err(|_| ())?; + client.put(true) + .map_err(|e| println!("{:?}", e))?; client.get_mut().1.extend_from_slice(payload); client.in_filesize(payload.len() as u64) .map_err(|e| println!("{:?}", e))?; @@ -86,8 +88,10 @@ pub async fn pull_data( _state: State<'_, Mutex>, ) -> Result { let mut client = data_client("")?; - client.custom_request("PROPFIND").map_err(|_| ())?; - client.perform().map_err(|_| ())?; + client.custom_request("PROPFIND") + .map_err(|e| println!("{:?}", e))?; + client.perform() + .map_err(|e| println!("{:?}", e))?; let content = &client.get_ref().0; Ok(String::from_utf8_lossy(content).to_string()) } From c1e63fa7617246a61ab208d5c52f0901c9d9e1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Fri, 7 Mar 2025 16:10:06 +0100 Subject: [PATCH 19/21] Break build --- Cargo.lock | 537 ++++++++++++++++++++++++++++++++++++-- Cargo.toml | 13 +- Tauri.toml | 26 ++ capabilities/Default.toml | 11 + capabilities/default.json | 13 - src/server/app_state.rs | 18 +- src/server/data_door.rs | 16 -- src/server/mod.rs | 3 +- src/types/account.rs | 15 +- src/types/store.rs | 17 +- tauri.conf.json | 37 --- 11 files changed, 559 insertions(+), 147 deletions(-) create mode 100644 Tauri.toml create mode 100644 capabilities/Default.toml delete mode 100644 capabilities/default.json delete mode 100644 tauri.conf.json diff --git a/Cargo.lock b/Cargo.lock index d9ed418..53e2280 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -249,6 +255,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -357,13 +372,14 @@ dependencies = [ "openssl", "rand 0.8.5", "ring-compat", - "rusqlite", "serde", "serde_json", + "sqlx", "tauri", "tauri-build", "tauri-plugin-fs", "tauri-plugin-opener", + "tauri-plugin-sql", "tauri-sys", "tokio", ] @@ -787,6 +803,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -805,6 +836,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -956,6 +996,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -1000,7 +1041,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -1085,6 +1128,12 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dpi" version = "0.1.1" @@ -1153,6 +1202,9 @@ name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] [[package]] name = "either_of" @@ -1255,6 +1307,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + [[package]] name = "event-listener" version = "5.4.0" @@ -1276,18 +1339,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - [[package]] name = "fastrand" version = "2.3.0" @@ -1333,6 +1384,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1449,6 +1511,17 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1887,6 +1960,8 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -1929,6 +2004,33 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "html-escape" version = "0.2.13" @@ -2429,6 +2531,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "leptos" @@ -2630,6 +2735,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libredox" version = "0.1.3" @@ -2642,9 +2753,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.31.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8935b44e7c13394a179a438e0cebba0fe08fe01b54f152e29a93b5cf993fd4" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -2755,6 +2866,16 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" @@ -2894,12 +3015,49 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2907,6 +3065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -3420,6 +3579,15 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -3603,6 +3771,17 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -4179,6 +4358,26 @@ dependencies = [ "signature", ] +[[package]] +name = "rsa" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rstml" version = "0.12.1" @@ -4194,20 +4393,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "rusqlite" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6d5e5acb6f6129fe3f7ba0a7fc77bca1942cb568535e18e7bc40262baf3110" -dependencies = [ - "bitflags 2.8.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -4623,6 +4808,17 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -4655,6 +4851,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ + "digest", "rand_core 0.6.4", ] @@ -4699,6 +4896,9 @@ name = "smallvec" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -4758,6 +4958,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.7.3" @@ -4768,6 +4977,197 @@ dependencies = [ "der", ] +[[package]] +name = "sqlx" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +dependencies = [ + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.2", + "hashlink", + "indexmap 2.7.1", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.12", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.98", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.98", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.8.0", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa 1.0.14", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.8.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa 1.0.14", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "time", + "tracing", + "url", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4805,6 +5205,17 @@ dependencies = [ "quote", ] +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" @@ -5159,6 +5570,25 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-sql" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ccca89ded6bd2ff49fdad9a5b34bcd624aa223fdfddbab83c85706ee3a4948" +dependencies = [ + "futures-core", + "indexmap 2.7.1", + "log", + "serde", + "serde_json", + "sqlx", + "tauri", + "tauri-plugin", + "thiserror 2.0.12", + "time", + "tokio", +] + [[package]] name = "tauri-runtime" version = "2.3.0" @@ -5429,6 +5859,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.13" @@ -5545,6 +5986,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5682,12 +6124,33 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -5842,6 +6305,12 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -6035,6 +6504,16 @@ dependencies = [ "windows-core 0.58.0", ] +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 64749bf..1699701 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,8 @@ server = [ "dep:tauri", "dep:tauri-plugin-opener", "dep:tauri-plugin-fs", - "dep:rusqlite", + "dep:tauri-plugin-sql", + "dep:sqlx", "dep:rand", "dep:chrono", "dep:tokio", @@ -26,7 +27,7 @@ crate-type = ["staticlib", "cdylib", "rlib"] name = "bkbh" [build-dependencies] -tauri-build = { version = "2", features = [] } +tauri-build = { version = "2", features = ["config-toml"] } [dependencies] console_error_panic_hook = { version = "0.1.7" } @@ -46,11 +47,9 @@ ring-compat = { version = "^0.8", features = [ "signature", "rand_core", ], optional = true } -rusqlite = { version = "^0.33", features = [ - "backup", - "bundled", -], optional = true } -tauri = { version = "2", features = [], optional = true } +sqlx = { version = "^0.8", features = ["sqlite"], optional = true } +tauri = { version = "2", features = ["config-toml"], optional = true } tauri-plugin-fs = { version = "2", optional = true } tauri-plugin-opener = { version = "2", optional = true } +tauri-plugin-sql = { version = "2", features = ["sqlite"], optional = true } tokio = { version = "^1.43", optional = true } diff --git a/Tauri.toml b/Tauri.toml new file mode 100644 index 0000000..8780e66 --- /dev/null +++ b/Tauri.toml @@ -0,0 +1,26 @@ +"$schema" = "https://schema.tauri.app/config/2" +identifier = "de.mathebau.bkbh" +productName = "Nein!" +version = "0.1.0" + +[build] +before-build-command = "cd bkbh && trunk build" +before-dev-command = "cd bkbh && trunk serve" +dev-url = "http://localhost:1420" +features = ["tauri"] +frontend-dist = "www" + +[app] +windows = [{ title = "Nein zur Bezahlkarte!", width = 800, height = 600 }] +with-global-tauri = true + +[bundle] +active = true +icon = [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico", +] +targets = "all" diff --git a/capabilities/Default.toml b/capabilities/Default.toml new file mode 100644 index 0000000..e17bc89 --- /dev/null +++ b/capabilities/Default.toml @@ -0,0 +1,11 @@ +"$schema" = "../gen/schemas/desktop-schema.json" +description = "Capability for the main window" +identifier = "default" +permissions = [ + "core:default", + "opener:default", + "fs:default", + "sql:default", + "sql:allow-execute", +] +windows = ["main"] diff --git a/capabilities/default.json b/capabilities/default.json deleted file mode 100644 index d93117c..0000000 --- a/capabilities/default.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": [ - "main" - ], - "permissions": [ - "core:default", - "opener:default", - "fs:default" - ] -} diff --git a/src/server/app_state.rs b/src/server/app_state.rs index df2c61a..a67f163 100644 --- a/src/server/app_state.rs +++ b/src/server/app_state.rs @@ -1,7 +1,7 @@ use rand::prelude::*; use ring_compat::signature::ed25519::SigningKey; -use rusqlite::Connection; use tokio::sync::Mutex; +use sqlx::sqlite::SqliteConnection as Connection; pub struct AppState { pub db: Connection, @@ -12,20 +12,8 @@ pub struct AppState { impl AppState { pub fn new() -> Self { - let db = Connection::open_in_memory() - .expect("Failed to create DB."); - db.execute( - "CREATE TABLE swap ( - rand INTEGER, - store INTEGER, - account INTEGER, - submitter INTEGER, - time INTEGER, - cancellation BOOL - )", - (), - ) - .unwrap(); + todo!() + let db = unimplemented!(); let mut rng = rand::thread_rng(); let last_sync = i64::MIN; let id = rng.r#gen(); diff --git a/src/server/data_door.rs b/src/server/data_door.rs index c1b2154..9ebb419 100644 --- a/src/server/data_door.rs +++ b/src/server/data_door.rs @@ -2,7 +2,6 @@ use chrono::offset::Utc; use curl::{easy, easy::Easy2}; use rand::prelude::*; use ring_compat::signature::ed25519::SigningKey; -use rusqlite::{Connection, DatabaseName}; use tauri::{Manager, State}; use tokio::sync::Mutex; @@ -104,20 +103,6 @@ async fn push_key(id: &u64, key: &SigningKey) -> Result<(), ()> { Ok(()) } -fn push_db(id: &u64, db: &Connection, app: tauri::AppHandle) -> Result<(), ()> { - let filename = format!("{:016X}.sqlite", id); - let path = app - .path() - .resolve(&filename, tauri::path::BaseDirectory::Temp) - .map_err(|e| println!("{:?}", e))?; - db.backup(DatabaseName::Main, &path, None) - .map_err(|e| println!("{:?}", e))?; - let buf = std::fs::read(&path).map_err(|e| println!("{:?}", e))?; - let client = put_client(&filename, buf.as_ref())?; - let _perf = client.perform().map_err(|e| println!("{:?}", e))?; - Ok(()) -} - #[tauri::command] pub async fn push_data( app: tauri::AppHandle, @@ -125,6 +110,5 @@ pub async fn push_data( ) -> Result<(), ()> { let state = state.lock().await; push_key(&state.id, &state.key).await?; - push_db(&state.id, &state.db, app)?; Ok(()) } diff --git a/src/server/mod.rs b/src/server/mod.rs index 27a877c..715c3f3 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,6 +2,7 @@ use chrono::offset::Utc; use std::collections::HashMap; use tauri::State; use tokio::sync::Mutex; +use sqlx::sqlite::SqliteConnection as Connection; use crate::types::*; @@ -79,7 +80,7 @@ pub async fn swap( pub async fn count(state: State<'_, Mutex>) -> Result { let state = state.lock().await; let mut stmt = - state.db.prepare("SELECT COUNT(*) FROM swap") + state.db.prepare_with("SELECT COUNT(*) FROM swap") .map_err(|e| println!("{:?}", e))?; let mut rows = stmt.query([]).map_err(|e| println!("{:?}", e))?; let row = rows.next().map_err(|e| println!("{:?}", e))?; diff --git a/src/types/account.rs b/src/types/account.rs index 6da16e1..8b89bb9 100644 --- a/src/types/account.rs +++ b/src/types/account.rs @@ -1,8 +1,7 @@ -#[cfg(feature = "server")] -use rusqlite::{types::ToSqlOutput, ToSql}; use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Serialize, Deserialize)] +#[cfg_attr(features = "dep:sqlx", derive(sqlx::Type))] pub enum Account { Sumpf, Heinersyndikat, @@ -37,14 +36,4 @@ impl std::fmt::Display for Account { } .fmt(f) } -} - -#[cfg(feature = "server")] -impl ToSql for Account { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Account::Sumpf => 0.to_sql(), - Account::Heinersyndikat => 1.to_sql(), - } - } -} +} \ No newline at end of file diff --git a/src/types/store.rs b/src/types/store.rs index cd0fe30..2531000 100644 --- a/src/types/store.rs +++ b/src/types/store.rs @@ -1,8 +1,7 @@ -#[cfg(feature = "server")] -use rusqlite::{types::ToSqlOutput, ToSql}; use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "server", derive(sqlx::Type))] pub enum Store { Aldi, Edeka, @@ -40,17 +39,3 @@ impl TryFrom<&str> for Store { } } } - -#[cfg(feature = "server")] -impl ToSql for Store { - fn to_sql(&self) -> rusqlite::Result> { - match self { - Store::Aldi => 0.to_sql(), - Store::Edeka => 1.to_sql(), - Store::Dm => 2.to_sql(), - Store::Lidl => 3.to_sql(), - Store::Rewe => 4.to_sql(), - Store::Tegut => 5.to_sql(), - } - } -} diff --git a/tauri.conf.json b/tauri.conf.json deleted file mode 100644 index 5ef499e..0000000 --- a/tauri.conf.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2", - "productName": "Nein!", - "version": "0.1.0", - "identifier": "de.mathebau.bkbh", - "build": { - "beforeDevCommand": "cd bkbh && trunk serve", - "devUrl": "http://localhost:1420", - "beforeBuildCommand": "cd bkbh && trunk build", - "frontendDist": "www", - "features": ["tauri"] - }, - "app": { - "withGlobalTauri": true, - "windows": [ - { - "title": "Nein zur Bezahlkarte!", - "width": 800, - "height": 600 - } - ], - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ] - } -} From 61105ccf373e3f5de847f0fb7e2cca1cb16c4c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Tue, 11 Mar 2025 05:25:14 +0100 Subject: [PATCH 20/21] Rename app --- Tauri.toml | 2 +- gen/android/app/build.gradle.kts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tauri.toml b/Tauri.toml index 8780e66..2a12b6b 100644 --- a/Tauri.toml +++ b/Tauri.toml @@ -1,5 +1,5 @@ "$schema" = "https://schema.tauri.app/config/2" -identifier = "de.mathebau.bkbh" +identifier = "de.hessensagtnein.darmstadt.buchhaltung" productName = "Nein!" version = "0.1.0" diff --git a/gen/android/app/build.gradle.kts b/gen/android/app/build.gradle.kts index 397ab02..86e6c7e 100644 --- a/gen/android/app/build.gradle.kts +++ b/gen/android/app/build.gradle.kts @@ -16,10 +16,10 @@ val tauriProperties = Properties().apply { android { compileSdk = 34 - namespace = "de.mathebau.bkbh" + namespace = "de.hessensagtnein.darmstadt.buchhaltung" defaultConfig { manifestPlaceholders["usesCleartextTraffic"] = "false" - applicationId = "de.mathebau.bkbh" + applicationId = "de.hessensagtnein.darmstadt.buchhaltung" minSdk = 24 targetSdk = 34 versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() From 58206d41b58a26abbbd6a6c49cfde05c97f20620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bianca=20F=C3=BCrstenau?= Date: Tue, 11 Mar 2025 08:00:11 +0100 Subject: [PATCH 21/21] Switch DB crate --- Cargo.toml | 2 +- migrations/0000_init.sql | 29 +++++++++++ src/lib.rs | 1 - src/server/app_state.rs | 2 +- src/server/mod.rs | 109 ++++++++++++++++++++++++++------------- src/types/account.rs | 9 ++-- src/types/cash.rs | 4 +- src/types/mod.rs | 14 ++--- src/types/store.rs | 13 ++--- 9 files changed, 126 insertions(+), 57 deletions(-) create mode 100644 migrations/0000_init.sql diff --git a/Cargo.toml b/Cargo.toml index 1699701..2260939 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ ring-compat = { version = "^0.8", features = [ "signature", "rand_core", ], optional = true } -sqlx = { version = "^0.8", features = ["sqlite"], optional = true } +sqlx = { version = "^0.8", features = ["sqlite", "runtime-tokio"], optional = true } tauri = { version = "2", features = ["config-toml"], optional = true } tauri-plugin-fs = { version = "2", optional = true } tauri-plugin-opener = { version = "2", optional = true } diff --git a/migrations/0000_init.sql b/migrations/0000_init.sql new file mode 100644 index 0000000..1aa1325 --- /dev/null +++ b/migrations/0000_init.sql @@ -0,0 +1,29 @@ +CREATE TABLE `swap` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `acc` INTEGER NOT NULL, + `voucher` INTEGER NOT NULL, + `storno` INTEGER NOT NULL, + `timestamp` INTEGER NOT NULL +); + +CREATE TABLE `voucher_type` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `store` INTEGER NOT NULL, + `value` INTEGER NOT NULL, + UNIQUE (`store`, `value`) +); + +CREATE TABLE `inventory` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `acc` INTEGER NOT NULL, + `cash` INTEGER NOT NULL, + `timestamp` INTEGER NOT NULL, + UNIQUE (`acc`, `timestamp`) +); + +CREATE TABLE `voucher_inventory` ( + `inventory` INTEGER NOT NULL, + `voucher` INTEGER NOT NULL, + `count` INTEGER NOT NULL, + PRIMARY KEY (`inventory`, `voucher`) +); diff --git a/src/lib.rs b/src/lib.rs index ef98862..32bb1c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,7 +25,6 @@ pub fn run() { }) .invoke_handler(tauri::generate_handler![ server::swap, - server::count, server::inventory, server::data_door::pull_data, server::data_door::push_data, diff --git a/src/server/app_state.rs b/src/server/app_state.rs index a67f163..0814efa 100644 --- a/src/server/app_state.rs +++ b/src/server/app_state.rs @@ -12,7 +12,7 @@ pub struct AppState { impl AppState { pub fn new() -> Self { - todo!() + todo!(); let db = unimplemented!(); let mut rng = rand::thread_rng(); let last_sync = i64::MIN; diff --git a/src/server/mod.rs b/src/server/mod.rs index 715c3f3..f852268 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -11,6 +11,10 @@ pub mod data_door; use app_state::AppState; +struct Id { + id: i64, +} + fn parse_inventory(data: HashMap) -> Result { let a = data.get("cafe-inventory-acc").ok_or(())?; let acc: Account = Account::try_from(a.as_ref())?; @@ -24,11 +28,13 @@ fn parse_inventory(data: HashMap) -> Result { None => (), Some(c) => { let c = if c == "" { "0" } else { c }; - let Ok(count) = c.parse() else { + let Ok(count): Result = c.parse() else { println!("Invalid count '{}' for '{}' in inventory data.", c, s); continue; }; - let v = VoucherInventory { store, count }; + let value = 50_00; + let voucher = VoucherType { store, value }; + let v = (voucher, count); vouchers.push(v); } } @@ -36,6 +42,28 @@ fn parse_inventory(data: HashMap) -> Result { unimplemented!() } +pub async fn voucher_id(v: VoucherType, db: &mut Connection) -> Result { + sqlx::query!( + "INSERT OR IGNORE INTO voucher_type(store, value) VALUES (?1, ?2)", + v.store, + v.value, + ) + .execute(&mut *db) + .await + .map_err(|e| println!("{:?}", e))?; + let id = sqlx::query_as!( + Id, + "SELECT id FROM voucher_type WHERE store = ?1 AND value = ?2", + v.store, + v.value, + ) + .fetch_one(db) + .await + .map_err(|e| println!("{:?}", e))? + .id; + Ok(id) +} + #[tauri::command] pub async fn inventory( data: HashMap, @@ -43,13 +71,37 @@ pub async fn inventory( ) -> Result<(), ()> { println!("{:?}", data); let now = Utc::now().timestamp(); - let state = state.lock().await; + let mut state = state.lock().await; let inv = parse_inventory(data)?; - for v in inv.vouchers { - state.db.execute( - "INSERT INTO voucher_inventory VALUES ()", - (inv.acc, v.store, v.count, now), + sqlx::query!( + "INSERT INTO inventory(acc, cash, timestamp) VALUES (?1, ?2, ?3)", + inv.acc, + inv.cash, + now, + ) + .execute(&mut state.db) + .await + .map_err(|e| println!("{:?}", e))?; + let inventory = sqlx::query_as!( + Id, + "SELECT id FROM inventory WHERE acc = ?1 AND timestamp = ?2", + inv.acc, + now, + ) + .fetch_one(&mut state.db) + .await + .map_err(|e| println!("{:?}", e))? + .id; + for (v, count) in inv.vouchers { + let voucher = voucher_id(v, &mut state.db).await?; + sqlx::query!( + "INSERT INTO voucher_inventory VALUES (?1, ?2, ?3)", + inventory, + voucher, + count, ) + .execute(&mut state.db) + .await .map_err(|e| println!("{:?}", e))?; } Ok(()) @@ -61,36 +113,21 @@ pub async fn swap( acc: i64, state: State<'_, Mutex>, ) -> Result<(), ()> { - let state = state.lock().await; - state.db.execute( - "INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5)", - ( - store, - acc, - i64::from_ne_bytes(state.id.to_ne_bytes()), - Utc::now().timestamp(), - false, - ), + let timestamp = Utc::now().timestamp(); + let mut state = state.lock().await; + let id = i64::from_ne_bytes(state.id.to_ne_bytes()); + let value = 50_00; + let voucher = VoucherType{ store, value }; + let voucher_type = voucher_id(voucher, &mut state.db).await?; + sqlx::query!( + "INSERT INTO swap(acc, voucher, storno, timestamp) VALUES (?1, ?2, ?3, ?4)", + acc, + voucher_type, + false, + timestamp, ) + .execute(&mut state.db) + .await .map_err(|e| println!("{:?}", e))?; Ok(()) } - -#[tauri::command] -pub async fn count(state: State<'_, Mutex>) -> Result { - let state = state.lock().await; - let mut stmt = - state.db.prepare_with("SELECT COUNT(*) FROM swap") - .map_err(|e| println!("{:?}", e))?; - let mut rows = stmt.query([]).map_err(|e| println!("{:?}", e))?; - let row = rows.next().map_err(|e| println!("{:?}", e))?; - let row = match row { - Some(r) => Ok(r), - None => { - println!("No rows"); - Err(()) - } - }?; - let cnt: u64 = row.get(0).map_err(|e| println!("{:?}", e))?; - Ok(cnt.to_string()) -} diff --git a/src/types/account.rs b/src/types/account.rs index 8b89bb9..e5f3cf7 100644 --- a/src/types/account.rs +++ b/src/types/account.rs @@ -1,10 +1,11 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Serialize, Deserialize)] -#[cfg_attr(features = "dep:sqlx", derive(sqlx::Type))] +#[cfg_attr(feature = "server", derive(sqlx::Type))] +#[cfg_attr(feature = "server", repr(i64))] pub enum Account { - Sumpf, - Heinersyndikat, + Sumpf = 1, + Heinersyndikat = 2, } impl TryFrom<&str> for Account { @@ -36,4 +37,4 @@ impl std::fmt::Display for Account { } .fmt(f) } -} \ No newline at end of file +} diff --git a/src/types/cash.rs b/src/types/cash.rs index d73255e..870b953 100644 --- a/src/types/cash.rs +++ b/src/types/cash.rs @@ -4,6 +4,8 @@ use serde::{Deserialize, Serialize}; /// measured as an integer multiple /// of 0.01 €. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr(feature = "server", derive(sqlx::Type))] +#[cfg_attr(feature = "server", sqlx(transparent))] pub struct Cash(i64); impl std::str::FromStr for Cash { @@ -20,4 +22,4 @@ impl std::str::FromStr for Cash { }; Ok(Cash(i * 100 + f)) } -} \ No newline at end of file +} diff --git a/src/types/mod.rs b/src/types/mod.rs index 0fa5794..eaf0734 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -8,15 +8,15 @@ pub use store::Store; pub use account::Account; pub use cash::Cash; +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct VoucherType { + pub store: Store, + pub value: i64, +} + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Inventory { pub acc: Account, pub cash: Cash, - pub vouchers: Vec, -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub struct VoucherInventory { - pub store: Store, - pub count: i64, + pub vouchers: Vec<(VoucherType, i64)>, } diff --git a/src/types/store.rs b/src/types/store.rs index 2531000..841ff94 100644 --- a/src/types/store.rs +++ b/src/types/store.rs @@ -2,13 +2,14 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Serialize, Deserialize)] #[cfg_attr(feature = "server", derive(sqlx::Type))] +#[cfg_attr(feature = "server", repr(i64))] pub enum Store { - Aldi, - Edeka, - Dm, - Lidl, - Rewe, - Tegut, + Aldi = 1, + Edeka = 2, + Dm = 3, + Lidl = 4, + Rewe = 5, + Tegut = 6, } impl Into for &Store {