use async_trait::async_trait;
use super::types::{PermissionRequest, PermissionResponse};
use crate::WalletError;
#[async_trait]
pub trait PermissionsModule: Send + Sync {
async fn on_request(
&self,
request: &PermissionRequest,
originator: &str,
) -> Result<PermissionResponse, WalletError>;
async fn on_response(
&self,
request: &PermissionRequest,
result: serde_json::Value,
originator: &str,
) -> Result<serde_json::Value, WalletError>;
}
pub fn detect_p_module_scheme(protocol: &str) -> Option<&str> {
if let Some(rest) = protocol.strip_prefix("p ") {
let trimmed = rest.trim_start();
if trimmed.is_empty() {
None
} else {
Some(rest)
}
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detect_p_module_scheme() {
assert_eq!(
detect_p_module_scheme("p custom-scheme"),
Some("custom-scheme")
);
assert_eq!(detect_p_module_scheme("p btms"), Some("btms"));
assert_eq!(detect_p_module_scheme("normal"), None);
assert_eq!(detect_p_module_scheme("p"), None);
assert_eq!(detect_p_module_scheme("p "), None);
assert_eq!(detect_p_module_scheme("protocol"), None);
assert_eq!(detect_p_module_scheme(""), None);
}
}