mirror of
https://github.com/tauri-apps/tauri.git
synced 2024-12-29 14:04:19 +03:00
feat: add #[non_exhaustive]
attribute (#1725)
This commit is contained in:
parent
6bfac866a7
commit
e087f0f937
8
.changes/non-exhaustive.md
Normal file
8
.changes/non-exhaustive.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
"tauri": patch
|
||||
"tauri-bundler": patch
|
||||
"tauri-codegen": patch
|
||||
"tauri-utils": patch
|
||||
---
|
||||
|
||||
Added the `#[non_exhaustive] attribute where appropriate.
|
5
.changes/remove-api-modules.md
Normal file
5
.changes/remove-api-modules.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
"tauri": patch
|
||||
---
|
||||
|
||||
Removed the `tcp` module from `tauri::api`.
|
5
.changes/setup-error-send.md
Normal file
5
.changes/setup-error-send.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
"tauri": patch
|
||||
---
|
||||
|
||||
The `setup` Error type must be `Send`.
|
@ -25,6 +25,7 @@ type Asset = (AssetKey, (PathBuf, PathBuf));
|
||||
|
||||
/// All possible errors while reading and compressing an [`EmbeddedAssets`] directory
|
||||
#[derive(Debug, Error)]
|
||||
#[non_exhaustive]
|
||||
pub enum EmbeddedAssetsError {
|
||||
#[error("failed to read asset at {path} because {error}")]
|
||||
AssetRead {
|
||||
|
@ -17,6 +17,7 @@ pub mod embedded_assets;
|
||||
|
||||
/// Represents all the errors that can happen while reading the config.
|
||||
#[derive(Debug, Error)]
|
||||
#[non_exhaustive]
|
||||
pub enum ConfigError {
|
||||
#[error("unable to access current working directory: {0}")]
|
||||
CurrentDir(std::io::Error),
|
||||
|
@ -11,7 +11,6 @@ edition = "2018"
|
||||
[dependencies]
|
||||
serde = { version = "1.0", features = [ "derive" ] }
|
||||
serde_json = "1.0"
|
||||
sysinfo = "0.17"
|
||||
thiserror = "1.0.24"
|
||||
phf = { version = "0.8", features = [ "macros" ] }
|
||||
zstd = "0.8"
|
||||
|
@ -11,6 +11,7 @@ use url::Url;
|
||||
/// The window webview URL options.
|
||||
#[derive(PartialEq, Debug, Clone, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
#[non_exhaustive]
|
||||
pub enum WindowUrl {
|
||||
/// An external URL.
|
||||
External(Url),
|
||||
|
@ -13,14 +13,13 @@ pub mod config;
|
||||
pub mod html;
|
||||
/// Platform helpers
|
||||
pub mod platform;
|
||||
/// Process helpers
|
||||
pub mod process;
|
||||
|
||||
/// Result type alias using the crate's error type.
|
||||
pub type Result<T> = std::result::Result<T, Error>;
|
||||
|
||||
/// The error types.
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// Target triple architecture error
|
||||
#[error("Unable to determine target-architecture")]
|
||||
|
@ -1,18 +0,0 @@
|
||||
// Copyright 2019-2021 Tauri Programme within The Commons Conservancy
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
use crate::Error;
|
||||
|
||||
pub use sysinfo::{Process, ProcessExt, Signal, System, SystemExt};
|
||||
|
||||
/// Gets the parent process
|
||||
pub fn get_parent_process(system: &mut sysinfo::System) -> Result<&Process, Error> {
|
||||
let pid = sysinfo::get_current_pid().unwrap();
|
||||
system.refresh_process(pid);
|
||||
let current_process = system.get_process(pid).ok_or(Error::ParentProcess)?;
|
||||
let parent_pid = current_process.parent().ok_or(Error::ParentPid)?;
|
||||
let parent_process = system.get_process(parent_pid).ok_or(Error::ParentProcess)?;
|
||||
|
||||
Ok(parent_process)
|
||||
}
|
@ -16,6 +16,7 @@ mod macros;
|
||||
|
||||
/// The resolution of a arg match.
|
||||
#[derive(Default, Debug, Serialize)]
|
||||
#[non_exhaustive]
|
||||
pub struct ArgData {
|
||||
/// The value of the arg.
|
||||
/// - Value::Bool if it's a flag,
|
||||
@ -30,6 +31,7 @@ pub struct ArgData {
|
||||
|
||||
/// The matched subcommand.
|
||||
#[derive(Default, Debug, Serialize)]
|
||||
#[non_exhaustive]
|
||||
pub struct SubcommandMatches {
|
||||
/// The subcommand name.
|
||||
pub name: String,
|
||||
@ -39,6 +41,7 @@ pub struct SubcommandMatches {
|
||||
|
||||
/// The arg matches of a command.
|
||||
#[derive(Default, Debug, Serialize)]
|
||||
#[non_exhaustive]
|
||||
pub struct Matches {
|
||||
/// Data structure mapping each found arg with its resolution.
|
||||
pub args: HashMap<String, ArgData>,
|
||||
|
@ -14,6 +14,7 @@ use tempfile::{self, tempdir};
|
||||
/// A DiskEntry is either a file or a directory.
|
||||
/// The `children` Vec is always `Some` if the entry is a directory.
|
||||
#[derive(Debug, Serialize)]
|
||||
#[non_exhaustive]
|
||||
pub struct DiskEntry {
|
||||
/// The path to this entry.
|
||||
pub path: PathBuf,
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
/// The error types.
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// Command error.
|
||||
#[error("Command Error: {0}")]
|
||||
|
@ -8,6 +8,7 @@ use std::{fs, io, path};
|
||||
|
||||
/// The supported archive formats.
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum ArchiveFormat {
|
||||
/// Tar archive.
|
||||
Tar(Option<Compression>),
|
||||
@ -19,6 +20,7 @@ pub enum ArchiveFormat {
|
||||
|
||||
/// The supported compression types.
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum Compression {
|
||||
/// Gz compression (e.g. `.tar.gz` archives)
|
||||
Gz,
|
||||
|
@ -114,6 +114,7 @@ impl Client {
|
||||
|
||||
#[derive(Serialize_repr, Deserialize_repr, Clone, Debug)]
|
||||
#[repr(u16)]
|
||||
#[non_exhaustive]
|
||||
/// The request's response type
|
||||
pub enum ResponseType {
|
||||
/// Read the response as JSON
|
||||
@ -127,6 +128,7 @@ pub enum ResponseType {
|
||||
/// FormBody data types.
|
||||
#[derive(Deserialize)]
|
||||
#[serde(untagged)]
|
||||
#[non_exhaustive]
|
||||
pub enum FormPart {
|
||||
/// A file path value.
|
||||
File(PathBuf),
|
||||
@ -150,6 +152,7 @@ impl FormBody {
|
||||
/// A body for the request.
|
||||
#[derive(Deserialize)]
|
||||
#[serde(tag = "type", content = "payload")]
|
||||
#[non_exhaustive]
|
||||
pub enum Body {
|
||||
/// A multipart formdata body.
|
||||
Form(FormBody),
|
||||
|
@ -22,8 +22,6 @@ pub mod process;
|
||||
pub mod rpc;
|
||||
/// The shell api.
|
||||
pub mod shell;
|
||||
/// TCP ports access API.
|
||||
pub mod tcp;
|
||||
/// The semver API.
|
||||
pub mod version;
|
||||
|
||||
|
@ -18,6 +18,7 @@ use serde_repr::{Deserialize_repr, Serialize_repr};
|
||||
/// For more information, check the [dirs_next documentation](https://docs.rs/dirs_next/).
|
||||
#[derive(Serialize_repr, Deserialize_repr, Clone, Debug)]
|
||||
#[repr(u16)]
|
||||
#[non_exhaustive]
|
||||
pub enum BaseDirectory {
|
||||
/// The Audio directory.
|
||||
Audio = 1,
|
||||
|
@ -37,6 +37,7 @@ pub struct TerminatedPayload {
|
||||
/// A event sent to the command callback.
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
#[serde(tag = "event", content = "payload")]
|
||||
#[non_exhaustive]
|
||||
pub enum CommandEvent {
|
||||
/// Stderr line.
|
||||
Stderr(String),
|
||||
|
@ -1,26 +0,0 @@
|
||||
// Copyright 2019-2021 Tauri Programme within The Commons Conservancy
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
use std::net::TcpListener;
|
||||
|
||||
use rand::distributions::{Distribution, Uniform};
|
||||
|
||||
/// Gets the first available port between 8000 and 9000.
|
||||
pub fn get_available_port() -> Option<u16> {
|
||||
let mut rng = rand::thread_rng();
|
||||
let die = Uniform::from(8000..9000);
|
||||
|
||||
for _i in 0..100 {
|
||||
let port = die.sample(&mut rng);
|
||||
if port_is_available(port) {
|
||||
return Some(port);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
/// Checks if the given port is available to use.
|
||||
pub fn port_is_available(port: u16) -> bool {
|
||||
TcpListener::bind(("127.0.0.1", port)).is_ok()
|
||||
}
|
@ -6,10 +6,11 @@ use std::path::PathBuf;
|
||||
|
||||
/// Runtime errors that can happen inside a Tauri application.
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// Failed to create webview.
|
||||
#[error("failed to create webview: {0}")]
|
||||
CreateWebview(String),
|
||||
CreateWebview(Box<dyn std::error::Error + Send>),
|
||||
/// Failed to create window.
|
||||
#[error("failed to create window")]
|
||||
CreateWindow,
|
||||
@ -39,7 +40,7 @@ pub enum Error {
|
||||
Base64Decode(#[from] base64::DecodeError),
|
||||
/// Failed to load window icon.
|
||||
#[error("invalid icon: {0}")]
|
||||
InvalidIcon(String),
|
||||
InvalidIcon(Box<dyn std::error::Error + Send>),
|
||||
/// Client with specified ID not found.
|
||||
#[error("http client dropped or not initialized")]
|
||||
HttpClientNotInitialized,
|
||||
@ -54,7 +55,7 @@ pub enum Error {
|
||||
InvalidArgs(&'static str, serde_json::Error),
|
||||
/// Encountered an error in the setup hook,
|
||||
#[error("error encountered during setup hook: {0}")]
|
||||
Setup(String),
|
||||
Setup(Box<dyn std::error::Error + Send>),
|
||||
/// Tauri updater error.
|
||||
#[cfg(feature = "updater")]
|
||||
#[error("Updater: {0}")]
|
||||
|
@ -12,7 +12,8 @@ use serde_json::Value as JsonValue;
|
||||
use std::{future::Future, sync::Arc};
|
||||
|
||||
/// A closure that is run when the Tauri application is setting up.
|
||||
pub type SetupHook<P> = Box<dyn Fn(&mut App<P>) -> Result<(), Box<dyn std::error::Error>> + Send>;
|
||||
pub type SetupHook<P> =
|
||||
Box<dyn Fn(&mut App<P>) -> Result<(), Box<dyn std::error::Error + Send>> + Send>;
|
||||
|
||||
/// A closure that is run everytime Tauri receives a message it doesn't explicitly handle.
|
||||
pub type InvokeHandler<P> = dyn Fn(Invoke<P>) + Send + Sync + 'static;
|
||||
|
@ -106,6 +106,7 @@ macro_rules! tauri_build_context {
|
||||
|
||||
/// A icon definition.
|
||||
#[derive(Debug, Clone)]
|
||||
#[non_exhaustive]
|
||||
pub enum Icon {
|
||||
/// Icon from file path.
|
||||
File(PathBuf),
|
||||
|
@ -163,7 +163,9 @@ where
|
||||
/// Defines the setup hook.
|
||||
pub fn setup<F>(mut self, setup: F) -> Self
|
||||
where
|
||||
F: Fn(&mut App<Args<E, L, A, R>>) -> Result<(), Box<dyn std::error::Error>> + Send + 'static,
|
||||
F: Fn(&mut App<Args<E, L, A, R>>) -> Result<(), Box<dyn std::error::Error + Send>>
|
||||
+ Send
|
||||
+ 'static,
|
||||
{
|
||||
self.setup = Box::new(setup);
|
||||
self
|
||||
@ -340,7 +342,7 @@ where
|
||||
#[cfg(feature = "updater")]
|
||||
app.run_updater(main_window);
|
||||
|
||||
(self.setup)(&mut app).map_err(|e| crate::Error::Setup(e.to_string()))?;
|
||||
(self.setup)(&mut app).map_err(|e| crate::Error::Setup(e))?;
|
||||
|
||||
app.runtime.run();
|
||||
Ok(())
|
||||
|
@ -70,11 +70,9 @@ impl TryFrom<Icon> for WryIcon {
|
||||
type Error = crate::Error;
|
||||
fn try_from(icon: Icon) -> Result<Self, Self::Error> {
|
||||
let image = match icon {
|
||||
Icon::File(path) => {
|
||||
image::open(path).map_err(|e| crate::Error::InvalidIcon(e.to_string()))?
|
||||
}
|
||||
Icon::File(path) => image::open(path).map_err(|e| crate::Error::InvalidIcon(Box::new(e)))?,
|
||||
Icon::Raw(raw) => {
|
||||
image::load_from_memory(&raw).map_err(|e| crate::Error::InvalidIcon(e.to_string()))?
|
||||
image::load_from_memory(&raw).map_err(|e| crate::Error::InvalidIcon(Box::new(e)))?
|
||||
}
|
||||
};
|
||||
let (width, height) = image.dimensions();
|
||||
@ -83,7 +81,7 @@ impl TryFrom<Icon> for WryIcon {
|
||||
rgba.extend_from_slice(&pixel.to_rgba().0);
|
||||
}
|
||||
let icon = WindowIcon::from_rgba(rgba, width, height)
|
||||
.map_err(|e| crate::Error::InvalidIcon(e.to_string()))?;
|
||||
.map_err(|e| crate::Error::InvalidIcon(Box::new(e)))?;
|
||||
Ok(Self(icon))
|
||||
}
|
||||
}
|
||||
@ -813,7 +811,7 @@ fn create_webview<M: Params<Runtime = Wry>>(
|
||||
|
||||
let window = window_attributes.build(event_loop).unwrap();
|
||||
let mut webview_builder = WebViewBuilder::new(window)
|
||||
.map_err(|e| crate::Error::CreateWebview(e.to_string()))?
|
||||
.map_err(|e| crate::Error::CreateWebview(Box::new(e)))?
|
||||
.with_url(&url)
|
||||
.unwrap(); // safe to unwrap because we validate the URL beforehand
|
||||
if let Some(handler) = rpc_handler {
|
||||
@ -842,7 +840,7 @@ fn create_webview<M: Params<Runtime = Wry>>(
|
||||
|
||||
webview_builder
|
||||
.build()
|
||||
.map_err(|e| crate::Error::CreateWebview(e.to_string()))
|
||||
.map_err(|e| crate::Error::CreateWebview(Box::new(e)))
|
||||
}
|
||||
|
||||
/// Create a wry rpc handler from a tauri rpc handler.
|
||||
|
@ -468,6 +468,7 @@ impl<P: Params> WindowManager<P> {
|
||||
)
|
||||
}
|
||||
WindowUrl::External(url) => (url.as_str().starts_with("tauri://"), url.to_string()),
|
||||
_ => unimplemented!(),
|
||||
};
|
||||
|
||||
if is_local {
|
||||
|
@ -137,6 +137,7 @@ pub trait WindowBuilder: WindowBuilderBase {
|
||||
}
|
||||
|
||||
/// Rpc request.
|
||||
#[non_exhaustive]
|
||||
pub struct RpcRequest {
|
||||
/// RPC command.
|
||||
pub command: String,
|
||||
@ -152,6 +153,7 @@ pub struct CustomProtocol {
|
||||
|
||||
/// The file drop event payload.
|
||||
#[derive(Debug, Clone)]
|
||||
#[non_exhaustive]
|
||||
pub enum FileDropEvent {
|
||||
/// The file(s) have been dragged onto the window, but have not been dropped yet.
|
||||
Hovered(Vec<PathBuf>),
|
||||
|
@ -18,6 +18,7 @@ use std::{
|
||||
|
||||
/// Tauri Settings.
|
||||
#[derive(Default, Deserialize, Serialize)]
|
||||
#[non_exhaustive]
|
||||
pub struct Settings {
|
||||
/// Whether the user allows notifications or not.
|
||||
#[cfg(notification_all)]
|
||||
|
@ -6,6 +6,7 @@ use thiserror::Error;
|
||||
|
||||
/// All errors that can occur while running the updater.
|
||||
#[derive(Debug, Error)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// IO Errors.
|
||||
#[error("`{0}`")]
|
||||
|
@ -15,6 +15,7 @@ const MACOS_APP_CATEGORY_PREFIX: &str = "public.app-category.";
|
||||
/// Corresponds to `LSApplicationCategoryType` on macOS and the GNOME desktop categories on Debian.
|
||||
#[allow(missing_docs)]
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum AppCategory {
|
||||
Business,
|
||||
DeveloperTool,
|
||||
|
@ -12,6 +12,7 @@ use std::{
|
||||
|
||||
/// The type of the package we're bundling.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum PackageType {
|
||||
/// The macOS application bundle (.app).
|
||||
MacOsBundle,
|
||||
|
@ -7,6 +7,7 @@ use thiserror::Error as DeriveError;
|
||||
|
||||
/// Errors returned by the bundler.
|
||||
#[derive(Debug, DeriveError)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// Bundler error.
|
||||
#[error("{0}")]
|
||||
|
Loading…
Reference in New Issue
Block a user