From 45b0bf00ee9756fe32e39076e29c4b35cdd96d40 Mon Sep 17 00:00:00 2001 From: Nell Date: Sat, 21 Feb 2026 10:51:05 +0100 Subject: [PATCH] init --- src-tauri/Cargo.lock | 477 ++++++++++++++++++ src-tauri/Cargo.toml | 7 + src-tauri/build.rs | 1 + src-tauri/src/app/mod.rs | 2 +- src-tauri/src/app/ox_speak_app.rs | 26 +- .../src/audio/{microphone => input}/mod.rs | 0 .../src/audio/{speaker => output}/mod.rs | 0 src-tauri/src/config/README.md | 1 + src-tauri/src/config/config.rs | 139 +++++ src-tauri/src/config/mod.rs | 2 + src-tauri/src/lib.rs | 29 +- src-tauri/src/main.rs | 6 +- src-tauri/src/tauri_app.rs | 53 ++ 13 files changed, 723 insertions(+), 20 deletions(-) rename src-tauri/src/audio/{microphone => input}/mod.rs (100%) rename src-tauri/src/audio/{speaker => output}/mod.rs (100%) create mode 100644 src-tauri/src/config/README.md create mode 100644 src-tauri/src/config/config.rs create mode 100644 src-tauri/src/config/mod.rs create mode 100644 src-tauri/src/tauri_app.rs diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7fe5bb5..281fde6 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -201,6 +201,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -213,6 +222,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.7" @@ -225,6 +240,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "1.3.2" @@ -441,6 +462,16 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "cmake" version = "0.1.57" @@ -469,6 +500,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "convert_case" version = "0.4.0" @@ -558,6 +595,18 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -605,6 +654,32 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "darling" version = "0.21.3" @@ -640,6 +715,16 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.5" @@ -670,7 +755,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -780,6 +867,60 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2", + "subtle", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "embed-resource" version = "3.0.6" @@ -890,6 +1031,22 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "field-offset" version = "0.3.6" @@ -900,6 +1057,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic", + "serde", + "uncased", + "version_check", +] + [[package]] name = "find-msvc-tools" version = "0.1.7" @@ -1169,6 +1338,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1301,6 +1471,17 @@ dependencies = [ "system-deps", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "gtk" version = "0.18.2" @@ -1389,6 +1570,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "html5ever" version = "0.29.1" @@ -1659,6 +1849,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -1805,6 +2004,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libappindicator" @@ -1846,6 +2048,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + [[package]] name = "libredox" version = "0.1.12" @@ -2025,12 +2233,48 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "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" @@ -2038,6 +2282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2322,12 +2567,56 @@ dependencies = [ name = "ox-speak" version = "0.1.0" dependencies = [ + "base64 0.22.1", + "figment", "opusic-sys", + "parking_lot", "serde", "serde_json", + "ssh-key", "tauri", "tauri-build", "tauri-plugin-opener", + "tokio", + "toml 0.9.11+spec-1.1.0", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2", ] [[package]] @@ -2390,6 +2679,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.2" @@ -2553,6 +2851,27 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2629,6 +2948,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2912,6 +3240,37 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -3012,6 +3371,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "selectors" version = "0.24.0" @@ -3237,6 +3610,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.8" @@ -3325,6 +3708,65 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssh-cipher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +dependencies = [ + "cipher", + "ssh-encoding", +] + +[[package]] +name = "ssh-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +dependencies = [ + "base64ct", + "pem-rfc7468", + "sha2", +] + +[[package]] +name = "ssh-key" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" +dependencies = [ + "ed25519-dalek", + "num-bigint-dig", + "p256", + "p384", + "p521", + "rand_core 0.6.4", + "rsa", + "sec1", + "sha2", + "signature", + "ssh-cipher", + "ssh-encoding", + "subtle", + "zeroize", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3362,6 +3804,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "swift-rs" version = "1.0.7" @@ -3853,11 +4301,25 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -4094,6 +4556,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -5086,6 +5557,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 6e61f16..cb0e565 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,3 +23,10 @@ tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" opusic-sys = "0.5" +tokio = { version = "1.49", features = ["full"] } + +figment = "0.10.19" +parking_lot = "0.12" +toml = "0.9" +ssh-key = { version = "0.6", features = ["default", "crypto"] } +base64 = "0.22" \ No newline at end of file diff --git a/src-tauri/build.rs b/src-tauri/build.rs index d860e1e..55335e6 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,3 +1,4 @@ + fn main() { tauri_build::build() } diff --git a/src-tauri/src/app/mod.rs b/src-tauri/src/app/mod.rs index a1398cc..eaa763c 100644 --- a/src-tauri/src/app/mod.rs +++ b/src-tauri/src/app/mod.rs @@ -1 +1 @@ -mod ox_speak_app; \ No newline at end of file +pub mod ox_speak_app; \ No newline at end of file diff --git a/src-tauri/src/app/ox_speak_app.rs b/src-tauri/src/app/ox_speak_app.rs index d02a539..bc9b562 100644 --- a/src-tauri/src/app/ox_speak_app.rs +++ b/src-tauri/src/app/ox_speak_app.rs @@ -1,14 +1,32 @@ -use tauri::AppHandle; +use crate::config::ConfigManager; +use tauri::{AppHandle, Manager}; pub struct OxSpeakApp { - tauri_handle: AppHandle + tauri_handle: AppHandle, + config: ConfigManager, } impl OxSpeakApp { pub async fn new(tauri_handle: AppHandle) -> Self { + // Chargement de la configuration + let config_dir = tauri_handle + .path() + .app_config_dir() + .expect("Failed to get app config dir"); + + let config = ConfigManager::load(config_dir) + .await + .expect("Failed to load config"); Self { - tauri_handle + tauri_handle, + config, } } -} \ No newline at end of file + + pub async fn run(&self) { + println!("Starting OxSpeak backend..."); + // infinite loop + println!("End of OxSpeak backend."); + } +} diff --git a/src-tauri/src/audio/microphone/mod.rs b/src-tauri/src/audio/input/mod.rs similarity index 100% rename from src-tauri/src/audio/microphone/mod.rs rename to src-tauri/src/audio/input/mod.rs diff --git a/src-tauri/src/audio/speaker/mod.rs b/src-tauri/src/audio/output/mod.rs similarity index 100% rename from src-tauri/src/audio/speaker/mod.rs rename to src-tauri/src/audio/output/mod.rs diff --git a/src-tauri/src/config/README.md b/src-tauri/src/config/README.md new file mode 100644 index 0000000..42c3630 --- /dev/null +++ b/src-tauri/src/config/README.md @@ -0,0 +1 @@ +Voir pour intégrer ça : https://lib.rs/crates/figment \ No newline at end of file diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs new file mode 100644 index 0000000..dfaedf1 --- /dev/null +++ b/src-tauri/src/config/config.rs @@ -0,0 +1,139 @@ +use base64::{engine::general_purpose, Engine as _}; +use parking_lot::Mutex; +use serde::{Deserialize, Serialize}; +use ssh_key::PrivateKey; +use std::net::{SocketAddr, ToSocketAddrs}; +use std::path::PathBuf; +use std::sync::Arc; +use tokio::fs; + +#[derive(Debug, Clone)] +pub struct ConfigManager { + tree_config: Arc>, // On garanti l'unicité avec un Mutex + path: PathBuf, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +struct ConfigTree { + pub servers: Vec, + pub identities: Vec, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +struct ConfigServer { + pub adresse: String, + pub identity: String, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +enum IdentityMode { + PrivateKeyPath, + PrivateKeyBase64, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +struct IdentityConfig { + pub id: String, + pub username: String, + pub private_key: String, + pub mode: IdentityMode, +} + +impl ConfigManager { + pub async fn load(config_dir: PathBuf) -> Result { + let config_path = config_dir.join("config.toml"); + + if config_path.exists() && config_path.is_file() { + let config_content = fs::read_to_string(config_path.clone()).await?; + if let Ok(tree_config) = toml::from_str::(&config_content) { + return Ok(Self { + tree_config: Arc::new(Mutex::new(tree_config)), + path: config_path, + }); + } + } + + Self::create(config_dir).await + } + + async fn create(config_dir: PathBuf) -> Result { + let config_path = config_dir.join("config.toml"); + + let tree_config = ConfigTree { + servers: Vec::new(), + identities: Vec::new(), + }; + + let config = ConfigManager { + tree_config: Arc::new(Mutex::new(tree_config)), + path: config_path, + }; + + config.save().await?; + + Ok(config) + } + + async fn save(&self) -> Result<(), std::io::Error> { + if !self.path.exists() { + if let Some(parent) = self.path.parent() { + fs::create_dir_all(parent).await?; + } + } + + // Lock le mutex pour lire tree_config + let tree_config = self.tree_config.lock(); + let serialized = toml::to_string_pretty(&*tree_config) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; + drop(tree_config); // Libère le lock explicitement + + fs::write(&self.path, serialized).await?; + Ok(()) + } +} + +impl IdentityConfig { + pub async fn load_private_key(&self) -> Result { + match self.mode { + IdentityMode::PrivateKeyPath => { + // Lire le fichier depuis le chemin + let path = expand_path(&self.private_key); + let key_content = fs::read_to_string(path).await?; + PrivateKey::from_openssh(&key_content) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e)) + } + IdentityMode::PrivateKeyBase64 => { + // Décoder le base64 + let decoded = general_purpose::STANDARD + .decode(&self.private_key) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?; + let key_content = String::from_utf8(decoded) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?; + PrivateKey::from_openssh(&key_content) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e)) + } + } + } +} + +impl ConfigServer { + /// Résout l'adresse (IP ou FQDN) en SocketAddr + pub fn resolve_address(&self) -> Result { + self.adresse.to_socket_addrs()?.next().ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + format!("Impossible de résoudre l'adresse: {}", self.adresse), + ) + }) + } +} + +fn expand_path(path: &str) -> PathBuf { + if path.starts_with("~/") { + if let Some(home) = std::env::var_os("HOME") { + return PathBuf::from(home).join(&path[2..]); + } + } + PathBuf::from(path) +} diff --git a/src-tauri/src/config/mod.rs b/src-tauri/src/config/mod.rs new file mode 100644 index 0000000..735d3cd --- /dev/null +++ b/src-tauri/src/config/mod.rs @@ -0,0 +1,2 @@ +mod config; +pub use config::ConfigManager; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 324ac41..7b23a0d 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,17 +1,20 @@ // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) -} +// #[tauri::command] +// fn greet(name: &str) -> String { +// format!("Hello, {}! You've been greeted from Rust!", name) +// } -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - tauri::Builder::default() - .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} +// #[cfg_attr(mobile, tauri::mobile_entry_point)] +// pub fn run() { +// tauri::Builder::default() +// .plugin(tauri_plugin_opener::init()) +// .invoke_handler(tauri::generate_handler![greet]) +// .run(tauri::generate_context!()) +// .expect("error while running tauri application"); +// } +pub mod tauri_app; mod utils; -mod app; \ No newline at end of file +mod app; + +mod config; diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 50925f0..b29e705 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,7 +1,8 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -fn main() { +#[tokio::main] +async fn main() { #[cfg(target_os = "linux")] { // On désactive l'Explicit Sync qui pose problème avec NVIDIA/Wayland @@ -12,5 +13,6 @@ fn main() { // std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); } - ox_speak_lib::run() + // ox_speak_lib::run() + ox_speak_lib::tauri_app::run().await; } diff --git a/src-tauri/src/tauri_app.rs b/src-tauri/src/tauri_app.rs new file mode 100644 index 0000000..fe9d562 --- /dev/null +++ b/src-tauri/src/tauri_app.rs @@ -0,0 +1,53 @@ +use crate::app::ox_speak_app::OxSpeakApp; +use std::sync::Arc; +use tauri::{Manager, WindowEvent}; + +// Séparation du generate_context, sinon l'RustRover (l'ide) rame énormément dans la fonction run +fn get_tauri_context() -> tauri::Context { + tauri::generate_context!() +} + +pub async fn run() { + println!("Starting tauri app..."); + tauri::async_runtime::set(tokio::runtime::Handle::current()); + + let tauri_context = get_tauri_context(); + + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .setup(|app| { + let handle = app.handle().clone(); + + // Démarrer le backend + tauri::async_runtime::spawn(async move { + let ox_speak = Arc::new(OxSpeakApp::new(handle.clone()).await); + handle.manage(ox_speak.clone()); + ox_speak.run().await; + }); + + Ok(()) + }) + .on_window_event(|windows, event| { + match event { + WindowEvent::CloseRequested { api, .. } => { + // api.prevent_close(); + } + _ => {} + } + }) + .run(tauri_context) + .expect("error while running tauri application"); +} + +#[tauri::command] +async fn greet(name: &str) -> Result { + println!("Hello from Rust: {}", name); + if name.is_empty() { + return Err("Le nom ne peut pas être vide".to_string()); + } + + // Simulation d'une opération async qui pourrait échouer + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + Ok(format!("Hello, {}!!! You've been greeted from Rust!", name)) +}