feat(core): add `plugin::PermissionState` (#10817)

* feat(core): add `plugin::mobile::PermissionState`

* move to plugin module

* default, specta::Type
This commit is contained in:
Lucas Fernandes Nogueira 2024-08-28 22:34:03 -03:00 committed by GitHub
parent cc799b2cc8
commit d7e5c00e94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 60 additions and 1 deletions

View File

@ -0,0 +1,5 @@
---
"tauri": patch:enhance
---
Added `plugin:::PermissionState` enum.

View File

@ -12,7 +12,10 @@ use crate::{
webview::PageLoadPayload,
AppHandle, Error, RunEvent, Runtime, Webview, Window,
};
use serde::de::DeserializeOwned;
use serde::{
de::{Deserialize, DeserializeOwned, Deserializer, Error as DeError},
Serialize, Serializer,
};
use serde_json::Value as JsonValue;
use tauri_macros::default_runtime;
use thiserror::Error;
@ -898,3 +901,54 @@ fn initialize<R: Runtime>(
)
.map_err(|e| Error::PluginInitialization(plugin.name().to_string(), e.to_string()))
}
/// Permission state.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
pub enum PermissionState {
/// Permission access has been granted.
Granted,
/// Permission access has been denied.
Denied,
/// Permission must be requested, but you must explain to the user why your app needs that permission. **Android only**.
PromptWithRationale,
/// Unknown state. Must request permission.
#[default]
Unknown,
}
impl std::fmt::Display for PermissionState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Granted => write!(f, "granted"),
Self::Denied => write!(f, "denied"),
Self::PromptWithRationale => write!(f, "prompt-with-rationale"),
Self::Unknown => write!(f, "Unknown"),
}
}
}
impl Serialize for PermissionState {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.to_string().as_ref())
}
}
impl<'de> Deserialize<'de> for PermissionState {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s = <String as Deserialize>::deserialize(deserializer)?;
match s.to_lowercase().as_str() {
"granted" => Ok(Self::Granted),
"denied" => Ok(Self::Denied),
"prompt-with-rationale" => Ok(Self::PromptWithRationale),
"prompt" => Ok(Self::Unknown),
_ => Err(DeError::custom(format!("unknown permission state '{s}'"))),
}
}
}