use serde::{Deserialize, Serialize};
use crate::bidi::BiDi;
use crate::bidi::command::{BidiCommand, Empty};
use crate::bidi::error::BidiError;
use crate::bidi::ids::ExtensionId;
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum ExtensionData {
Path {
path: String,
},
ArchivePath {
path: String,
},
Base64 {
value: String,
},
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Install {
pub extension_data: ExtensionData,
}
impl BidiCommand for Install {
const METHOD: &'static str = "webExtension.install";
type Returns = InstallResult;
}
#[derive(Debug, Clone, Deserialize)]
pub struct InstallResult {
pub extension: ExtensionId,
}
#[derive(Debug, Clone, Serialize)]
pub struct Uninstall {
pub extension: ExtensionId,
}
impl BidiCommand for Uninstall {
const METHOD: &'static str = "webExtension.uninstall";
type Returns = Empty;
}
#[derive(Debug)]
pub struct WebExtensionModule<'a> {
bidi: &'a BiDi,
}
impl<'a> WebExtensionModule<'a> {
pub(crate) fn new(bidi: &'a BiDi) -> Self {
Self {
bidi,
}
}
pub async fn install(&self, extension_data: ExtensionData) -> Result<InstallResult, BidiError> {
self.bidi
.send(Install {
extension_data,
})
.await
}
pub async fn install_path(&self, path: impl Into<String>) -> Result<InstallResult, BidiError> {
self.install(ExtensionData::Path {
path: path.into(),
})
.await
}
pub async fn install_archive(
&self,
path: impl Into<String>,
) -> Result<InstallResult, BidiError> {
self.install(ExtensionData::ArchivePath {
path: path.into(),
})
.await
}
pub async fn install_base64(
&self,
value: impl Into<String>,
) -> Result<InstallResult, BidiError> {
self.install(ExtensionData::Base64 {
value: value.into(),
})
.await
}
pub async fn uninstall(&self, extension: ExtensionId) -> Result<(), BidiError> {
self.bidi
.send(Uninstall {
extension,
})
.await?;
Ok(())
}
}