* 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
187 lines
5.7 KiB
Rust
187 lines
5.7 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::fmt::Display;
|
|
use std::str::FromStr;
|
|
|
|
#[derive(
|
|
Copy,
|
|
Clone,
|
|
Hash,
|
|
PartialEq,
|
|
Eq,
|
|
PartialOrd,
|
|
Ord,
|
|
Serialize,
|
|
Deserialize,
|
|
Debug,
|
|
Default,
|
|
clap::ValueEnum,
|
|
)]
|
|
#[non_exhaustive]
|
|
pub(crate) enum Platform {
|
|
/// Targeting the web platform using WASM
|
|
#[clap(name = "web")]
|
|
#[serde(rename = "web")]
|
|
#[default]
|
|
Web,
|
|
|
|
/// Targeting macos desktop
|
|
/// When running on macos, you can also use `--platform desktop` to build for the desktop
|
|
#[cfg_attr(target_os = "macos", clap(alias = "desktop"))]
|
|
#[clap(name = "macos")]
|
|
#[serde(rename = "macos")]
|
|
MacOS,
|
|
|
|
/// Targeting windows desktop
|
|
/// When running on windows, you can also use `--platform desktop` to build for the desktop
|
|
#[cfg_attr(target_os = "windows", clap(alias = "desktop"))]
|
|
#[clap(name = "windows")]
|
|
#[serde(rename = "windows")]
|
|
Windows,
|
|
|
|
/// Targeting linux desktop
|
|
/// When running on linux, you can also use `--platform desktop` to build for the desktop
|
|
#[cfg_attr(target_os = "linux", clap(alias = "desktop"))]
|
|
#[clap(name = "linux")]
|
|
#[serde(rename = "linux")]
|
|
Linux,
|
|
|
|
/// Targeting the ios platform
|
|
///
|
|
/// Can't work properly if you're not building from an Apple device.
|
|
#[clap(name = "ios")]
|
|
#[serde(rename = "ios")]
|
|
Ios,
|
|
|
|
/// Targeting the android platform
|
|
#[clap(name = "android")]
|
|
#[serde(rename = "android")]
|
|
Android,
|
|
|
|
/// Targeting the server platform using Axum and Dioxus-Fullstack
|
|
///
|
|
/// This is implicitly passed if `fullstack` is enabled as a feature. Using this variant simply
|
|
/// means you're only building the server variant without the `.wasm` to serve.
|
|
#[clap(name = "server")]
|
|
#[serde(rename = "server")]
|
|
Server,
|
|
|
|
/// Targeting the static generation platform using SSR and Dioxus-Fullstack
|
|
#[clap(name = "liveview")]
|
|
#[serde(rename = "liveview")]
|
|
Liveview,
|
|
}
|
|
|
|
/// An error that occurs when a platform is not recognized
|
|
pub(crate) struct UnknownPlatformError;
|
|
|
|
impl std::fmt::Display for UnknownPlatformError {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(f, "Unknown platform")
|
|
}
|
|
}
|
|
|
|
impl FromStr for Platform {
|
|
type Err = UnknownPlatformError;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
match s {
|
|
"web" => Ok(Self::Web),
|
|
"macos" => Ok(Self::MacOS),
|
|
"windows" => Ok(Self::Windows),
|
|
"linux" => Ok(Self::Linux),
|
|
"liveview" => Ok(Self::Liveview),
|
|
"server" => Ok(Self::Server),
|
|
"ios" => Ok(Self::Ios),
|
|
"android" => Ok(Self::Android),
|
|
_ => Err(UnknownPlatformError),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Display for Platform {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
f.write_str(match self {
|
|
Platform::Web => "web",
|
|
Platform::MacOS => "macos",
|
|
Platform::Windows => "windows",
|
|
Platform::Linux => "linux",
|
|
Platform::Ios => "ios",
|
|
Platform::Android => "android",
|
|
Platform::Server => "server",
|
|
Platform::Liveview => "liveview",
|
|
})
|
|
}
|
|
}
|
|
|
|
impl Platform {
|
|
/// Get the feature name for the platform in the dioxus crate
|
|
pub(crate) fn feature_name(&self) -> &str {
|
|
match self {
|
|
Platform::Web => "web",
|
|
Platform::MacOS => "desktop",
|
|
Platform::Windows => "desktop",
|
|
Platform::Linux => "desktop",
|
|
Platform::Server => "server",
|
|
Platform::Liveview => "liveview",
|
|
Platform::Ios => "mobile",
|
|
Platform::Android => "mobile",
|
|
}
|
|
}
|
|
|
|
/// Get the name of the folder we need to generate for this platform
|
|
///
|
|
/// Note that web and server share the same platform folder since we'll export the web folder as a bundle on its own
|
|
pub(crate) fn build_folder_name(&self) -> &'static str {
|
|
match self {
|
|
Platform::Web => "web",
|
|
Platform::Server => "web",
|
|
Platform::Liveview => "liveview",
|
|
Platform::Ios => "ios",
|
|
Platform::Android => "android",
|
|
Platform::Windows => "windows",
|
|
Platform::Linux => "linux",
|
|
Platform::MacOS => "macos",
|
|
}
|
|
}
|
|
|
|
pub(crate) fn expected_name(&self) -> &'static str {
|
|
match self {
|
|
Platform::Web => "Web",
|
|
Platform::MacOS => "Desktop MacOS",
|
|
Platform::Windows => "Desktop Windows",
|
|
Platform::Linux => "Desktop Linux",
|
|
Platform::Ios => "Mobile iOS",
|
|
Platform::Android => "Mobile Android",
|
|
Platform::Server => "Server",
|
|
Platform::Liveview => "Liveview",
|
|
}
|
|
}
|
|
|
|
pub(crate) fn autodetect_from_cargo_feature(feature: &str) -> Option<Self> {
|
|
match feature {
|
|
"web" => Some(Platform::Web),
|
|
"desktop" => {
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
Some(Platform::MacOS)
|
|
}
|
|
#[cfg(target_os = "windows")]
|
|
{
|
|
Some(Platform::Windows)
|
|
}
|
|
#[cfg(target_os = "linux")]
|
|
{
|
|
Some(Platform::Linux)
|
|
}
|
|
}
|
|
"mobile" => {
|
|
tracing::warn!("Could not autodetect mobile platform. Mobile platforms must be explicitly specified. Pass `--platform ios` or `--platform android` instead.");
|
|
None
|
|
}
|
|
"liveview" => Some(Platform::Liveview),
|
|
"server" => Some(Platform::Server),
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|