diff --git a/.gitignore b/.gitignore index 73341191..2abab6cd 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ dist-ssr *.sw? .rsw +*.sqlite diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index da52f926..ce991881 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -103,6 +103,15 @@ dependencies = [ "system-deps 6.0.3", ] +[[package]] +name = "atoi" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" +dependencies = [ + "num-traits", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -389,6 +398,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + [[package]] name = "crc32fast" version = "1.3.2" @@ -408,6 +432,16 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.14" @@ -515,7 +549,7 @@ dependencies = [ "hashbrown", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.7", ] [[package]] @@ -578,7 +612,7 @@ dependencies = [ "libc", "log", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "pin-project", "serde", "serde_json", @@ -654,6 +688,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dotenvy" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" + [[package]] name = "dprint-swc-ext" version = "0.7.0" @@ -724,6 +764,12 @@ dependencies = [ "syn", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fastrand" version = "1.9.0" @@ -765,6 +811,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.5", +] + [[package]] name = "fnv" version = "1.0.7" @@ -869,6 +927,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.11.2", +] + [[package]] name = "futures-io" version = "0.3.26" @@ -1226,6 +1295,18 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" @@ -1241,6 +1322,9 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" @@ -1251,6 +1335,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "html5ever" version = "0.25.2" @@ -1461,6 +1551,15 @@ dependencies = [ "syn", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1667,6 +1766,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "libsqlite3-sys" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "line-wrap" version = "0.1.1" @@ -1775,6 +1885,12 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -1854,6 +1970,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 = "nom8" version = "0.2.0" @@ -2077,6 +2203,17 @@ dependencies = [ "system-deps 6.0.3", ] +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -2084,7 +2221,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.7", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", ] [[package]] @@ -2574,6 +2725,21 @@ dependencies = [ "winreg", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2607,6 +2773,27 @@ dependencies = [ "semver 1.0.16", ] +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + [[package]] name = "rustversion" version = "1.0.11" @@ -2655,6 +2842,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "security-framework" version = "2.8.2" @@ -2903,15 +3100,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - [[package]] name = "siphasher" version = "0.3.10" @@ -2986,6 +3174,118 @@ dependencies = [ "url", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sqlformat" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +dependencies = [ + "itertools", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" +dependencies = [ + "sqlx-core", + "sqlx-macros", +] + +[[package]] +name = "sqlx-core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" +dependencies = [ + "ahash", + "atoi", + "bitflags", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "dotenvy", + "either", + "event-listener", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "hashlink", + "hex", + "indexmap", + "itoa 1.0.5", + "libc", + "libsqlite3-sys", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls", + "rustls-pemfile", + "sha2", + "smallvec", + "sqlformat", + "sqlx-rt", + "stringprep", + "thiserror", + "tokio-stream", + "url", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" +dependencies = [ + "dotenvy", + "either", + "heck 0.4.1", + "once_cell", + "proc-macro2", + "quote", + "sha2", + "sqlx-core", + "sqlx-rt", + "syn", + "url", +] + +[[package]] +name = "sqlx-rt" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" +dependencies = [ + "once_cell", + "tokio", + "tokio-rustls", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3015,7 +3315,7 @@ checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3046,6 +3346,16 @@ dependencies = [ "syn", ] +[[package]] +name = "stringprep" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "strsim" version = "0.10.0" @@ -3463,7 +3773,7 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "paste", "png 0.17.7", "raw-window-handle", @@ -3547,6 +3857,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "sqlx", "tauri", "tauri-build", "tokio", @@ -3801,25 +4112,11 @@ dependencies = [ "memchr", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", - "tokio-macros", "windows-sys 0.42.0", ] -[[package]] -name = "tokio-macros" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -3830,6 +4127,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.7" @@ -4020,6 +4339,18 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.3.1" @@ -4251,6 +4582,25 @@ dependencies = [ "system-deps 6.0.3", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + [[package]] name = "webview2-com" version = "0.19.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 891fcd09..c9c9b8fb 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -18,12 +18,13 @@ serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.2", features = ["config-toml", "devtools", "shell-open", "system-tray", "window-start-dragging"] } http = { version = "0.2.8" } reqwest = { version = "0.11.14", features = ["json"] } -tokio = { version = "1.25.0", features = ["full"] } +tokio = { version = "1.25.0", features = [ "sync"] } futures = { version = "0.3.26" } deno_core = { version = "0.171.0" } deno_ast = { version = "0.24.0", features = ["transpiling"] } objc = { version = "0.2.7" } cocoa = { version = "0.24.1" } +sqlx = { version = "0.6.2", features = ["sqlite", "runtime-tokio-rustls"] } [features] # by default Tauri runs in production mode diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs deleted file mode 100644 index 63bd18dc..00000000 --- a/src-tauri/src/commands.rs +++ /dev/null @@ -1,102 +0,0 @@ -use http::header::{HeaderName, USER_AGENT}; -use http::{HeaderMap, HeaderValue, Method}; -use reqwest::redirect::Policy; -use std::collections::HashMap; -use tauri::{AppHandle, Wry}; - -#[derive(serde::Serialize)] -pub struct CustomResponse { - status: String, - body: String, - url: String, - method: String, - elapsed: u128, - elapsed2: u128, - headers: HashMap, -} - -#[tauri::command] -pub async fn send_request( - app_handle: AppHandle, - url: &str, - method: &str, -) -> Result { - let start = std::time::Instant::now(); - - let mut abs_url = url.to_string(); - if !abs_url.starts_with("http://") && !abs_url.starts_with("https://") { - abs_url = format!("http://{}", url); - } - - let client = reqwest::Client::builder() - .redirect(Policy::none()) - .build() - .unwrap(); - - let mut headers = HeaderMap::new(); - // headers.insert(CONTENT_TYPE, HeaderValue::from_static("image/png")); - headers.insert(USER_AGENT, HeaderValue::from_static("reqwest")); - headers.insert("x-foo-bar", HeaderValue::from_static("hi mom")); - headers.insert( - HeaderName::from_static("x-api-key"), - HeaderValue::from_static("123-123-123"), - ); - - let m = Method::from_bytes(method.to_uppercase().as_bytes()).unwrap(); - let req = client - .request(m, abs_url.to_string()) - .headers(headers) - .build(); - - let req = match req { - Ok(v) => v, - Err(e) => { - println!("Error: {}", e); - return Err(e.to_string()); - } - }; - - let resp = client.execute(req).await; - - let elapsed = start.elapsed().as_millis(); - - let p = app_handle - .path_resolver() - .resolve_resource("plugins/plugin.ts") - .expect("failed to resolve resource"); - - crate::runtime::run_plugin_sync(p.to_str().unwrap()).unwrap(); - - match resp { - Ok(v) => { - let url = v.url().to_string(); - let status = v.status().to_string(); - let method = method.to_string(); - let headers = v - .headers() - .iter() - .map(|(k, v)| (k.as_str().to_string(), v.to_str().unwrap().to_string())) - .collect::>(); - let body = v.text().await.unwrap(); - let elapsed2 = start.elapsed().as_millis(); - Ok(CustomResponse { - status, - body, - elapsed, - elapsed2, - method, - url, - headers, - }) - } - Err(e) => { - println!("Error: {}", e); - Err(e.to_string()) - } - } -} - -#[tauri::command] -pub fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) -} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0230f272..5e8d4f42 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,11 +7,19 @@ #[macro_use] extern crate objc; +use std::collections::HashMap; +use tokio::sync::Mutex; + +use http::header::{HeaderName, USER_AGENT}; +use http::{HeaderMap, HeaderValue, Method}; +use reqwest::redirect::Policy; +use sqlx::sqlite::SqlitePoolOptions; +use sqlx::{Pool, Sqlite}; +use tauri::{AppHandle, State, Wry}; use tauri::{CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, WindowEvent}; use window_ext::WindowExt; -mod commands; mod runtime; mod window_ext; @@ -28,6 +36,17 @@ fn main() { win.position_traffic_lights(); Ok(()) }) + .setup(|app| { + tauri::async_runtime::block_on(async move { + let pool = SqlitePoolOptions::new() + .connect("sqlite://db.sqlite?mode=rwc") + .await + .unwrap(); + app.manage(Mutex::new(pool)); + + Ok(()) + }) + }) .on_system_tray_event(|app, event| match event { SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { "quit" => { @@ -53,10 +72,131 @@ fn main() { _ => {} } }) - .invoke_handler(tauri::generate_handler![ - commands::send_request, - commands::greet - ]) + .invoke_handler(tauri::generate_handler![send_request, greet, load_db,]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } + +#[derive(serde::Serialize)] +pub struct CustomResponse { + status: u16, + body: String, + url: String, + method: String, + elapsed: u128, + elapsed2: u128, + headers: HashMap, + pub status_reason: Option<&'static str>, +} + +#[tauri::command] +async fn load_db(db_instance: State<'_, Mutex>>) -> Result<(), String> { + let row = sqlx::query( + "CREATE TABLE IF NOT EXISTS responses ( + id INTEGER PRIMARY KEY, + body TEXT NOT NULL, + status INT NOT NULL", + ) + .execute(&*db_instance.lock().await) + .await; + match row { + Ok(_) => println!("SUCCESS!"), + Err(e) => println!("Error: {}", e), + } + + Ok(()) +} + +#[tauri::command] +async fn send_request( + app_handle: AppHandle, + db_instance: State<'_, Mutex>>, + url: &str, + method: &str, +) -> Result { + let start = std::time::Instant::now(); + + let mut abs_url = url.to_string(); + if !abs_url.starts_with("http://") && !abs_url.starts_with("https://") { + abs_url = format!("http://{}", url); + } + + let client = reqwest::Client::builder() + .redirect(Policy::none()) + .build() + .unwrap(); + + let mut headers = HeaderMap::new(); + headers.insert(USER_AGENT, HeaderValue::from_static("reqwest")); + headers.insert("x-foo-bar", HeaderValue::from_static("hi mom")); + headers.insert( + HeaderName::from_static("x-api-key"), + HeaderValue::from_static("123-123-123"), + ); + + let m = Method::from_bytes(method.to_uppercase().as_bytes()).unwrap(); + let req = client + .request(m, abs_url.to_string()) + .headers(headers) + .build(); + + let req = match req { + Ok(v) => v, + Err(e) => { + println!("Error: {}", e); + return Err(e.to_string()); + } + }; + + let resp = client.execute(req).await; + + let elapsed = start.elapsed().as_millis(); + + let p = app_handle + .path_resolver() + .resolve_resource("plugins/plugin.ts") + .expect("failed to resolve resource"); + + runtime::run_plugin_sync(p.to_str().unwrap()).unwrap(); + + match resp { + Ok(v) => { + let url = v.url().to_string(); + let status = v.status().as_u16(); + let status_reason = v.status().canonical_reason(); + let method = method.to_string(); + let headers = v + .headers() + .iter() + .map(|(k, v)| (k.as_str().to_string(), v.to_str().unwrap().to_string())) + .collect::>(); + let body = v.text().await.unwrap(); + let elapsed2 = start.elapsed().as_millis(); + sqlx::query("INSERT INTO responses (body, status) VALUES (?, ?)") + .bind(body.clone()) + .bind(status.clone()) + .execute(&*db_instance.lock().await) + .await + .unwrap(); + Ok(CustomResponse { + status, + status_reason, + body, + elapsed, + elapsed2, + method, + url, + headers, + }) + } + Err(e) => { + println!("Error: {}", e); + Err(e.to_string()) + } + } +} + +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} diff --git a/src-web/App.tsx b/src-web/App.tsx index ee9c89bd..6a1572c5 100644 --- a/src-web/App.tsx +++ b/src-web/App.tsx @@ -36,6 +36,7 @@ function App() { resp.body = resp.body.replace(//gi, ``); } setResponse(resp); + console.log('Response', resp.status, resp.url, { resp }); } catch (err) { setError(`${err}`); } diff --git a/src-web/components/Input.tsx b/src-web/components/Input.tsx index 63c53f7a..f3ca97d8 100644 --- a/src-web/components/Input.tsx +++ b/src-web/components/Input.tsx @@ -46,7 +46,7 @@ export function Input({ id={id} className={classnames( className, - 'bg-transparent pl-3 pr-2 h-full w-0 min-w-[100%] focus:outline-none', + 'bg-transparent min-w-0 pl-3 pr-2 w-full h-full focus:outline-none', )} {...props} /> diff --git a/src-web/hooks/useCodemirror.ts b/src-web/hooks/useCodemirror.ts index 63e8974f..9b45edcc 100644 --- a/src-web/hooks/useCodemirror.ts +++ b/src-web/hooks/useCodemirror.ts @@ -27,7 +27,6 @@ const syntaxExtensions: Record = { }; const extensions = [basicSetup, syntaxHighlighting(myHighlightStyle)]; -export type EditorLanguage = keyof typeof syntaxExtensions; export default function useCodeMirror({ value, diff --git a/src-web/main.tsx b/src-web/main.tsx index b6d89744..b689b960 100644 --- a/src-web/main.tsx +++ b/src-web/main.tsx @@ -4,11 +4,13 @@ import App from './App'; import { HelmetProvider } from 'react-helmet-async'; import { MotionConfig } from 'framer-motion'; import init, { greet } from 'hello'; +import { invoke } from '@tauri-apps/api' import './main.css'; await init(); greet(); +await invoke('load_db'); ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(