feat: replace desktop by a fresh Tauri install, and add a new frontend module using Nuxt
This commit is contained in:
@ -10,16 +10,11 @@ name = "desktop_lib"
|
||||
crate-type = ["lib", "cdylib", "staticlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.0.0-beta", features = [] }
|
||||
tauri-build = { version = "2.0.0-rc", features = [] }
|
||||
|
||||
[dependencies]
|
||||
axum = "0.7.5"
|
||||
tauri = { version = "2.0.0-beta", features = [] }
|
||||
tower = "0.4.13"
|
||||
tokio = "1.39.1"
|
||||
|
||||
app = { path = "../app" }
|
||||
http = "1.1.0"
|
||||
bytes = "1.6.1"
|
||||
thiserror = "1.0.63"
|
||||
tauri = { version = "2.0.0-rc", features = [] }
|
||||
tauri-plugin-shell = "2.0.0-rc"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
|
||||
|
10
crates/desktop/capabilities/default.json
Normal file
10
crates/desktop/capabilities/default.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "Capability for the main window",
|
||||
"windows": ["main"],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"shell:allow-open"
|
||||
]
|
||||
}
|
@ -1,88 +1,14 @@
|
||||
use axum::body::{to_bytes, Body};
|
||||
use axum::Router;
|
||||
use bytes::Bytes;
|
||||
use http::{request, response, Request, Response};
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use tauri::path::BaseDirectory;
|
||||
use tauri::Manager;
|
||||
use thiserror::Error;
|
||||
use tokio::sync::{Mutex, MutexGuard};
|
||||
use tower::{Service, ServiceExt};
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum DesktopError {
|
||||
#[error("Axum error:\n{0}")]
|
||||
Axum(#[from] axum::Error),
|
||||
#[error("Infallible error")]
|
||||
Infallible(#[from] std::convert::Infallible),
|
||||
}
|
||||
|
||||
/// Process requests sent to Tauri (with the `axum://` protocol) and handle them with Axum
|
||||
/// When an error occurs, this function is expected to panic, which should result in a 500 error
|
||||
/// being sent to the client, so we let the client handle the error recovering
|
||||
async fn process_tauri_request(
|
||||
tauri_request: Request<Vec<u8>>,
|
||||
mut router: MutexGuard<'_, Router>,
|
||||
) -> Result<Response<Vec<u8>>, DesktopError> {
|
||||
let (parts, body): (request::Parts, Vec<u8>) = tauri_request.into_parts();
|
||||
let axum_request: Request<Body> = Request::from_parts(parts, body.into());
|
||||
|
||||
let axum_response: Response<Body> = router
|
||||
.as_service()
|
||||
.ready()
|
||||
.await
|
||||
.map_err(DesktopError::Infallible)?
|
||||
.call(axum_request)
|
||||
.await
|
||||
.map_err(DesktopError::Infallible)?;
|
||||
|
||||
let (parts, body): (response::Parts, Body) = axum_response.into_parts();
|
||||
let body: Bytes = to_bytes(body, usize::MAX).await?;
|
||||
|
||||
let tauri_response: Response<Vec<u8>> = Response::from_parts(parts, body.into());
|
||||
Ok(tauri_response)
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[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()
|
||||
.setup(|app| {
|
||||
let assets_path: PathBuf = app
|
||||
.path()
|
||||
.resolve("assets", BaseDirectory::Resource)
|
||||
.expect("Assets path should be resolvable");
|
||||
|
||||
// Adds Axum router to application state
|
||||
// This makes it so we can retrieve it from any app instance (see bellow)
|
||||
let router = Arc::new(Mutex::new(app::get_router(&assets_path)));
|
||||
|
||||
app.manage(router);
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.register_asynchronous_uri_scheme_protocol("axum", move |app, request, responder| {
|
||||
// Retrieve the router from the application state and clone it for the async block
|
||||
let router = Arc::clone(&app.state::<Arc<Mutex<axum::Router>>>());
|
||||
|
||||
// Spawn a new async task to process the request
|
||||
tauri::async_runtime::spawn(async move {
|
||||
let router = router.lock().await;
|
||||
match process_tauri_request(request, router).await {
|
||||
Ok(response) => responder.respond(response),
|
||||
Err(err) => {
|
||||
let body = format!("Failed to process an axum:// request:\n{}", err);
|
||||
responder.respond(
|
||||
http::Response::builder()
|
||||
.status(http::StatusCode::BAD_REQUEST)
|
||||
.header(http::header::CONTENT_TYPE, "text/plain")
|
||||
.body::<Vec<u8>>(body.into())
|
||||
.expect("BAD_REQUEST response should be valid"),
|
||||
)
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
.plugin(tauri_plugin_shell::init())
|
||||
.invoke_handler(tauri::generate_handler![greet])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
|
@ -1,20 +1,24 @@
|
||||
{
|
||||
"productName": "Logiciel Pharma",
|
||||
"$schema": "https://schema.tauri.app/config/2.0.0-rc",
|
||||
"productName": "Chrys4lide LGO",
|
||||
"version": "0.0.1",
|
||||
"identifier": "org.p4pillon.pharma.desktop",
|
||||
"identifier": "org.p4pillon.chrys4lide.lgo",
|
||||
"build": {
|
||||
"beforeDevCommand": {
|
||||
"cwd": "../app",
|
||||
"script": "cargo run"
|
||||
"cwd": "../../frontend",
|
||||
"script": "bun run dev"
|
||||
},
|
||||
"devUrl": "http://localhost:3000",
|
||||
"frontendDist": "axum://place.holder/"
|
||||
"devUrl": "http://localhost:1420",
|
||||
"beforeBuildCommand": {
|
||||
"cwd": "../../frontend",
|
||||
"script": "bun run generate"
|
||||
},
|
||||
"frontendDist": "../../frontend/dist"
|
||||
},
|
||||
"app": {
|
||||
"withGlobalTauri": true,
|
||||
"windows": [
|
||||
{
|
||||
"title": "Logiciel Pharma",
|
||||
"title": "Chrys4lide | LG0",
|
||||
"width": 800,
|
||||
"height": 600
|
||||
}
|
||||
@ -25,9 +29,6 @@
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"resources": {
|
||||
"../app/assets/": "./assets/"
|
||||
},
|
||||
"targets": "all",
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
@ -37,5 +38,4 @@
|
||||
"icons/icon.ico"
|
||||
]
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user