Fix bundling/path errors, sidecar support, iOS/Android simulator support, asset hotreload fixes, serverfn hotrelad, native tailwind support (#2779)
* wip: fix manganis import path * upgrade tauri bundler, convert todo!() to unimplemented!() * feat: mobile hotreloading + ios asset configuration * remove oid demo and its associated env vars * nuke all the things that cause cache thrashing * swap to Asset type * add some more logs * display impl for attrvalue * dont panic on collect failure * cut down web deps to 150 * clean up deps in a lot of places, simplify build scripts * clean up asset resolution and cli-dev profile * wire up absolute paths for manganis asset in a particular mode * move document related things around to shorten compile times * move most things to `document::Item` and then decompose the cli-config * switch link to stylesheet for clarity in examples * move manganis workspace example to examples folder * decompose manganis-cli-support * dont need mobile demo anymore * remove gloo dialogs * html doesnt need document * rename hotreload to devtools * really clean up the html crate * fix weird rsx spacing * clean up desktop to use callback * clean up document a bit * re-wire up devsocket * fix utf css * yeeeet that js out of here * synthetic web system works * web crate almost done being cleaned up * desktop mostly cleaned up too * clean up cli a bit * more cli cleanup * cli builds again * clean up cli, inline structs, cut down number of unique types where possible * hotreload works again for desktop and this time, mobile too * cfg out tungstenite * devserver err * more refactor to cli builder * switch to unbounded_send * new structure is much cleaner * add http serve subcommand * bundled hotreload * kick stylsheets * clean up a bit more, split up eventloop * amazingly serve seems done * change from pub to pub(crate) in cli * remove tools * bit more polish to cli * fix issue with join * gracefully handle fullstack without a server * fullstack mobile demo * fix launch function, move projects into example-projects folder * hoist examples * add "run" command * clean up launch * remove old manual websocket receiver * doctor command * allow desktop to scroll * cut apart router crate * dont put launch in prelude * use dioxus::launch where possible * rename rsx, cut out hotreload tests * remove liveview project * bump native * fix compile for renderers * move sync event response out of interpreter * move render in serve * rollback settings change * cli compiles, huzzah! * change uris for asset * fix asset * new tui screen * new cargo-like tui works * very very verty close * it works! very small bug with incorrect grapheme calc * Clean up devserver a bit * status sytem * tidy up debug filters * clean up logging situation * Fix a number of bugs with log printing * new printing system is more reliable * wire up more stuff * things working but fullstack is having issues * fullstack works again! * hotreloading bundled assets works again * bundled hotreload and beginnings of macos bundling * Hotreload desktop * combined server builds * add build handle * fix fullstack assets * make open async, add some hooks for ios * migrate filemap to runner * wip global crate system * fixup bundles + organize asset * fix asset location bug * all the bundled reloading! * open ios simulator! * full hotreload support for mobile + serverfn * basic cleanups * clean up dx * Move filemap * fix cutting of newlines * assets workibg, some android * hoist wry/tao * use sync locks and headers to fix issues with android * desktop -> mac/win/linux with alias * better logging * feat: workspace (entire computer!) hotreload * should rebuild toggle, ios simulator bootup * proper mobile support in launch * more robust handling of assets * fix cargo * bring back some of tauri bundle * make warnings go away, clippy happy on cli * some final clippy cleanups * fmt * move manganis to its own folder * upgrade bundle to stable * drastically slim down manganis, prepping for merge * typos, failing test, docsrs config * remove static gen test * nix static gen test * we use --platform web instead of --platform fullstack now * only bind dev urls in desktop/mobile * install gtk * nix static gen * split build dir by app name
This commit is contained in:
1 parent
ef436e4ed0
commit
7ec3453ca3
156 files changed
+11544
-9005
No files matched your search
@@ -0,0 +1,23 @@
|
||||
use crate::Platform;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct ApplicationConfig {
|
||||
#[serde(default = "default_platform")]
|
||||
pub(crate) default_platform: Platform,
|
||||
|
||||
#[serde(default = "asset_dir_default")]
|
||||
pub(crate) asset_dir: PathBuf,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) sub_package: Option<String>,
|
||||
}
|
||||
|
||||
pub(crate) fn default_platform() -> Platform {
|
||||
Platform::Web
|
||||
}
|
||||
|
||||
pub(crate) fn asset_dir_default() -> PathBuf {
|
||||
PathBuf::from("assets")
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
pub(crate) struct BundleConfig {
|
||||
pub(crate) identifier: Option<String>,
|
||||
pub(crate) publisher: Option<String>,
|
||||
pub(crate) icon: Option<Vec<String>>,
|
||||
pub(crate) resources: Option<Vec<String>>,
|
||||
pub(crate) copyright: Option<String>,
|
||||
pub(crate) category: Option<String>,
|
||||
pub(crate) short_description: Option<String>,
|
||||
pub(crate) long_description: Option<String>,
|
||||
pub(crate) external_bin: Option<Vec<String>>,
|
||||
pub(crate) deb: Option<DebianSettings>,
|
||||
pub(crate) macos: Option<MacOsSettings>,
|
||||
pub(crate) windows: Option<WindowsSettings>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
pub(crate) struct DebianSettings {
|
||||
// OS-specific settings:
|
||||
/// the list of debian dependencies.
|
||||
pub depends: Option<Vec<String>>,
|
||||
/// the list of dependencies the package provides.
|
||||
pub provides: Option<Vec<String>>,
|
||||
/// the list of package conflicts.
|
||||
pub conflicts: Option<Vec<String>>,
|
||||
/// the list of package replaces.
|
||||
pub replaces: Option<Vec<String>>,
|
||||
/// List of custom files to add to the deb package.
|
||||
/// Maps the path on the debian package to the path of the file to include (relative to the current working directory).
|
||||
pub files: HashMap<PathBuf, PathBuf>,
|
||||
/// Path to a custom desktop file Handlebars template.
|
||||
///
|
||||
/// Available variables: `categories`, `comment` (optional), `exec`, `icon` and `name`.
|
||||
pub desktop_template: Option<PathBuf>,
|
||||
/// Define the section in Debian Control file. See : <https://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections>
|
||||
pub section: Option<String>,
|
||||
/// Change the priority of the Debian Package. By default, it is set to `optional`.
|
||||
/// Recognized Priorities as of now are : `required`, `important`, `standard`, `optional`, `extra`
|
||||
pub priority: Option<String>,
|
||||
/// Path of the uncompressed Changelog file, to be stored at /usr/share/doc/package-name/changelog.gz. See
|
||||
/// <https://www.debian.org/doc/debian-policy/ch-docs.html#changelog-files-and-release-notes>
|
||||
pub changelog: Option<PathBuf>,
|
||||
/// Path to script that will be executed before the package is unpacked. See
|
||||
/// <https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html>
|
||||
pub pre_install_script: Option<PathBuf>,
|
||||
/// Path to script that will be executed after the package is unpacked. See
|
||||
/// <https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html>
|
||||
pub post_install_script: Option<PathBuf>,
|
||||
/// Path to script that will be executed before the package is removed. See
|
||||
/// <https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html>
|
||||
pub pre_remove_script: Option<PathBuf>,
|
||||
/// Path to script that will be executed after the package is removed. See
|
||||
/// <https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html>
|
||||
pub post_remove_script: Option<PathBuf>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
pub(crate) struct WixSettings {
|
||||
pub(crate) language: Vec<(String, Option<PathBuf>)>,
|
||||
pub(crate) template: Option<PathBuf>,
|
||||
pub(crate) fragment_paths: Vec<PathBuf>,
|
||||
pub(crate) component_group_refs: Vec<String>,
|
||||
pub(crate) component_refs: Vec<String>,
|
||||
pub(crate) feature_group_refs: Vec<String>,
|
||||
pub(crate) feature_refs: Vec<String>,
|
||||
pub(crate) merge_refs: Vec<String>,
|
||||
pub(crate) skip_webview_install: bool,
|
||||
pub(crate) license: Option<PathBuf>,
|
||||
pub(crate) enable_elevated_update_task: bool,
|
||||
pub(crate) banner_path: Option<PathBuf>,
|
||||
pub(crate) dialog_image_path: Option<PathBuf>,
|
||||
pub(crate) fips_compliant: bool,
|
||||
/// MSI installer version in the format `major.minor.patch.build` (build is optional).
|
||||
///
|
||||
/// Because a valid version is required for MSI installer, it will be derived from [`PackageSettings::version`] if this field is not set.
|
||||
///
|
||||
/// The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255.
|
||||
/// The third and fourth fields have a maximum value of 65,535.
|
||||
///
|
||||
/// See <https://learn.microsoft.com/en-us/windows/win32/msi/productversion> for more info.
|
||||
pub version: Option<String>,
|
||||
/// A GUID upgrade code for MSI installer. This code **_must stay the same across all of your updates_**,
|
||||
/// otherwise, Windows will treat your update as a different app and your users will have duplicate versions of your app.
|
||||
///
|
||||
/// By default, tauri generates this code by generating a Uuid v5 using the string `<productName>.exe.app.x64` in the DNS namespace.
|
||||
/// You can use Tauri's CLI to generate and print this code for you by running `tauri inspect wix-upgrade-code`.
|
||||
///
|
||||
/// It is recommended that you set this value in your tauri config file to avoid accidental changes in your upgrade code
|
||||
/// whenever you want to change your product name.
|
||||
pub upgrade_code: Option<uuid::Uuid>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
pub(crate) struct MacOsSettings {
|
||||
pub(crate) frameworks: Option<Vec<String>>,
|
||||
pub(crate) minimum_system_version: Option<String>,
|
||||
pub(crate) license: Option<String>,
|
||||
pub(crate) exception_domain: Option<String>,
|
||||
pub(crate) signing_identity: Option<String>,
|
||||
pub(crate) provider_short_name: Option<String>,
|
||||
pub(crate) entitlements: Option<String>,
|
||||
pub(crate) info_plist_path: Option<PathBuf>,
|
||||
/// List of custom files to add to the application bundle.
|
||||
/// Maps the path in the Contents directory in the app to the path of the file to include (relative to the current working directory).
|
||||
pub files: HashMap<PathBuf, PathBuf>,
|
||||
/// Preserve the hardened runtime version flag, see <https://developer.apple.com/documentation/security/hardened_runtime>
|
||||
///
|
||||
/// Settings this to `false` is useful when using an ad-hoc signature, making it less strict.
|
||||
pub hardened_runtime: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WindowsSettings {
|
||||
pub(crate) digest_algorithm: Option<String>,
|
||||
pub(crate) certificate_thumbprint: Option<String>,
|
||||
pub(crate) timestamp_url: Option<String>,
|
||||
pub(crate) tsp: bool,
|
||||
pub(crate) wix: Option<WixSettings>,
|
||||
pub(crate) icon_path: Option<PathBuf>,
|
||||
pub(crate) webview_install_mode: WebviewInstallMode,
|
||||
pub(crate) webview_fixed_runtime_path: Option<PathBuf>,
|
||||
pub(crate) allow_downgrades: bool,
|
||||
pub(crate) nsis: Option<NsisSettings>,
|
||||
/// Specify a custom command to sign the binaries.
|
||||
/// This command needs to have a `%1` in it which is just a placeholder for the binary path,
|
||||
/// which we will detect and replace before calling the command.
|
||||
///
|
||||
/// Example:
|
||||
/// ```text
|
||||
/// sign-cli --arg1 --arg2 %1
|
||||
/// ```
|
||||
///
|
||||
/// By Default we use `signtool.exe` which can be found only on Windows so
|
||||
/// if you are on another platform and want to cross-compile and sign you will
|
||||
/// need to use another tool like `osslsigncode`.
|
||||
pub sign_command: Option<CustomSignCommandSettings>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct NsisSettings {
|
||||
pub(crate) template: Option<PathBuf>,
|
||||
pub(crate) license: Option<PathBuf>,
|
||||
pub(crate) header_image: Option<PathBuf>,
|
||||
pub(crate) sidebar_image: Option<PathBuf>,
|
||||
pub(crate) installer_icon: Option<PathBuf>,
|
||||
pub(crate) install_mode: NSISInstallerMode,
|
||||
pub(crate) languages: Option<Vec<String>>,
|
||||
pub(crate) custom_language_files: Option<HashMap<String, PathBuf>>,
|
||||
pub(crate) display_language_selector: bool,
|
||||
pub(crate) start_menu_folder: Option<String>,
|
||||
pub(crate) installer_hooks: Option<PathBuf>,
|
||||
/// Try to ensure that the WebView2 version is equal to or newer than this version,
|
||||
/// if the user's WebView2 is older than this version,
|
||||
/// the installer will try to trigger a WebView2 update.
|
||||
pub minimum_webview2_version: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) enum NSISInstallerMode {
|
||||
CurrentUser,
|
||||
PerMachine,
|
||||
Both,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) enum WebviewInstallMode {
|
||||
Skip,
|
||||
DownloadBootstrapper { silent: bool },
|
||||
EmbedBootstrapper { silent: bool },
|
||||
OfflineInstaller { silent: bool },
|
||||
FixedRuntime { path: PathBuf },
|
||||
}
|
||||
|
||||
impl Default for WebviewInstallMode {
|
||||
fn default() -> Self {
|
||||
Self::OfflineInstaller { silent: false }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub(crate) enum PackageType {
|
||||
MacOsBundle,
|
||||
IosBundle,
|
||||
WindowsMsi,
|
||||
Deb,
|
||||
Rpm,
|
||||
AppImage,
|
||||
Dmg,
|
||||
Updater,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct CustomSignCommandSettings {
|
||||
/// The command to run to sign the binary.
|
||||
pub cmd: String,
|
||||
/// The arguments to pass to the command.
|
||||
///
|
||||
/// "%1" will be replaced with the path to the binary to be signed.
|
||||
pub args: Vec<String>,
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// Represents configuration items for the desktop platform.
|
||||
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct DesktopConfig {}
|
||||
@@ -0,0 +1,105 @@
|
||||
use super::*;
|
||||
use crate::Result;
|
||||
use anyhow::Context;
|
||||
use krates::{Krates, NodeId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct DioxusConfig {
|
||||
pub(crate) application: ApplicationConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) web: WebConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) desktop: DesktopConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) bundle: BundleConfig,
|
||||
}
|
||||
|
||||
impl Default for DioxusConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
application: ApplicationConfig {
|
||||
default_platform: default_platform(),
|
||||
asset_dir: asset_dir_default(),
|
||||
sub_package: None,
|
||||
},
|
||||
web: WebConfig {
|
||||
app: WebAppConfig {
|
||||
title: default_title(),
|
||||
base_path: None,
|
||||
},
|
||||
proxy: vec![],
|
||||
watcher: Default::default(),
|
||||
resource: WebResourceConfig {
|
||||
dev: WebDevResourceConfig {
|
||||
style: vec![],
|
||||
script: vec![],
|
||||
},
|
||||
style: Some(vec![]),
|
||||
script: Some(vec![]),
|
||||
},
|
||||
https: WebHttpsConfig {
|
||||
enabled: None,
|
||||
mkcert: None,
|
||||
key_path: None,
|
||||
cert_path: None,
|
||||
},
|
||||
pre_compress: true,
|
||||
wasm_opt: Default::default(),
|
||||
},
|
||||
desktop: DesktopConfig::default(),
|
||||
bundle: BundleConfig::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl DioxusConfig {
|
||||
pub fn load(krates: &Krates, package: NodeId) -> Result<Option<Self>> {
|
||||
// Walk up from the cargo.toml to the root of the workspace looking for Dioxus.toml
|
||||
let mut current_dir = krates[package]
|
||||
.manifest_path
|
||||
.parent()
|
||||
.unwrap()
|
||||
.as_std_path()
|
||||
.to_path_buf()
|
||||
.canonicalize()?;
|
||||
|
||||
let workspace_path = krates
|
||||
.workspace_root()
|
||||
.as_std_path()
|
||||
.to_path_buf()
|
||||
.canonicalize()?;
|
||||
|
||||
let mut dioxus_conf_file = None;
|
||||
while current_dir.starts_with(&workspace_path) {
|
||||
let config = ["Dioxus.toml", "dioxus.toml"]
|
||||
.into_iter()
|
||||
.map(|file| current_dir.join(file))
|
||||
.find(|path| path.is_file());
|
||||
|
||||
// Try to find Dioxus.toml in the current directory
|
||||
if let Some(new_config) = config {
|
||||
dioxus_conf_file = Some(new_config.as_path().to_path_buf());
|
||||
break;
|
||||
}
|
||||
// If we can't find it, go up a directory
|
||||
current_dir = current_dir
|
||||
.parent()
|
||||
.context("Failed to find Dioxus.toml")?
|
||||
.to_path_buf();
|
||||
}
|
||||
|
||||
let Some(dioxus_conf_file) = dioxus_conf_file else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
toml::from_str::<DioxusConfig>(&std::fs::read_to_string(&dioxus_conf_file)?)
|
||||
.map_err(|err| {
|
||||
anyhow::anyhow!("Failed to parse Dioxus.toml at {dioxus_conf_file:?}: {err}").into()
|
||||
})
|
||||
.map(Some)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#![allow(unused)] // lots of configs...
|
||||
|
||||
use clap::Parser;
|
||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4};
|
||||
|
||||
/// The arguments for the address the server will run on
|
||||
#[derive(Clone, Debug, Parser)]
|
||||
pub(crate) struct AddressArguments {
|
||||
/// The port the server will run on
|
||||
#[clap(long)]
|
||||
#[clap(default_value_t = default_port())]
|
||||
pub(crate) port: u16,
|
||||
|
||||
/// The address the server will run on
|
||||
#[clap(long, default_value_t = default_address())]
|
||||
pub(crate) addr: std::net::IpAddr,
|
||||
}
|
||||
|
||||
impl Default for AddressArguments {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
port: default_port(),
|
||||
addr: default_address(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn default_port() -> u16 {
|
||||
8080
|
||||
}
|
||||
|
||||
fn default_address() -> IpAddr {
|
||||
IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1))
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebConfig {
|
||||
#[serde(default)]
|
||||
pub(crate) app: WebAppConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) proxy: Vec<WebProxyConfig>,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) watcher: WebWatcherConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) resource: WebResourceConfig,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) https: WebHttpsConfig,
|
||||
|
||||
/// Whether to enable pre-compression of assets and wasm during a web build in release mode
|
||||
#[serde(default = "true_bool")]
|
||||
pub(crate) pre_compress: bool,
|
||||
|
||||
/// The wasm-opt configuration
|
||||
#[serde(default)]
|
||||
pub(crate) wasm_opt: WasmOptConfig,
|
||||
}
|
||||
|
||||
impl Default for WebConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
pre_compress: true_bool(),
|
||||
app: Default::default(),
|
||||
https: Default::default(),
|
||||
wasm_opt: Default::default(),
|
||||
proxy: Default::default(),
|
||||
watcher: Default::default(),
|
||||
resource: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The wasm-opt configuration
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
pub(crate) struct WasmOptConfig {
|
||||
/// The wasm-opt level to use for release builds [default: s]
|
||||
/// Options:
|
||||
/// - z: optimize aggressively for size
|
||||
/// - s: optimize for size
|
||||
/// - 1: optimize for speed
|
||||
/// - 2: optimize for more for speed
|
||||
/// - 3: optimize for even more for speed
|
||||
/// - 4: optimize aggressively for speed
|
||||
#[serde(default)]
|
||||
pub(crate) level: WasmOptLevel,
|
||||
|
||||
/// Keep debug symbols in the wasm file
|
||||
#[serde(default = "false_bool")]
|
||||
pub(crate) debug: bool,
|
||||
}
|
||||
|
||||
/// The wasm-opt level to use for release web builds [default: 4]
|
||||
#[derive(Default, Debug, Copy, Clone, Serialize, Deserialize)]
|
||||
pub(crate) enum WasmOptLevel {
|
||||
/// Optimize aggressively for size
|
||||
#[serde(rename = "z")]
|
||||
Z,
|
||||
/// Optimize for size
|
||||
#[serde(rename = "s")]
|
||||
S,
|
||||
/// Don't optimize
|
||||
#[serde(rename = "0")]
|
||||
Zero,
|
||||
/// Optimize for speed
|
||||
#[serde(rename = "1")]
|
||||
One,
|
||||
/// Optimize for more for speed
|
||||
#[serde(rename = "2")]
|
||||
Two,
|
||||
/// Optimize for even more for speed
|
||||
#[serde(rename = "3")]
|
||||
Three,
|
||||
/// Optimize aggressively for speed
|
||||
#[serde(rename = "4")]
|
||||
#[default]
|
||||
Four,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebAppConfig {
|
||||
#[serde(default = "default_title")]
|
||||
pub(crate) title: String,
|
||||
pub(crate) base_path: Option<String>,
|
||||
}
|
||||
|
||||
impl WebAppConfig {
|
||||
/// Get the normalized base path for the application with `/` trimmed from both ends. If the base path is not set, this will return `.`.
|
||||
pub(crate) fn base_path(&self) -> &str {
|
||||
match &self.base_path {
|
||||
Some(path) => path.trim_matches('/'),
|
||||
None => ".",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for WebAppConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
title: default_title(),
|
||||
base_path: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebProxyConfig {
|
||||
pub(crate) backend: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebWatcherConfig {
|
||||
#[serde(default = "watch_path_default")]
|
||||
pub(crate) watch_path: Vec<PathBuf>,
|
||||
|
||||
#[serde(default)]
|
||||
pub(crate) reload_html: bool,
|
||||
|
||||
#[serde(default = "true_bool")]
|
||||
pub(crate) index_on_404: bool,
|
||||
}
|
||||
|
||||
impl Default for WebWatcherConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
watch_path: watch_path_default(),
|
||||
reload_html: false,
|
||||
index_on_404: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn watch_path_default() -> Vec<PathBuf> {
|
||||
vec![PathBuf::from("src"), PathBuf::from("examples")]
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebResourceConfig {
|
||||
pub(crate) dev: WebDevResourceConfig,
|
||||
pub(crate) style: Option<Vec<PathBuf>>,
|
||||
pub(crate) script: Option<Vec<PathBuf>>,
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebDevResourceConfig {
|
||||
#[serde(default)]
|
||||
pub(crate) style: Vec<PathBuf>,
|
||||
#[serde(default)]
|
||||
pub(crate) script: Vec<PathBuf>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
||||
pub(crate) struct WebHttpsConfig {
|
||||
pub(crate) enabled: Option<bool>,
|
||||
pub(crate) mkcert: Option<bool>,
|
||||
pub(crate) key_path: Option<String>,
|
||||
pub(crate) cert_path: Option<String>,
|
||||
}
|
||||
|
||||
fn true_bool() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
fn false_bool() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
pub(crate) fn default_title() -> String {
|
||||
"dioxus | ⛺".into()
|
||||
}
|
||||
Reference in new issue
Block a user