use serde::{Deserialize, Serialize};
use crate::bidi::BiDi;
use crate::bidi::command::{BidiCommand, Empty};
use crate::bidi::error::BidiError;
use crate::bidi::ids::{BrowsingContextId, UserContextId};
#[derive(Debug, Clone, Default, Serialize)]
pub struct Status;
#[derive(Debug, Clone, Deserialize)]
pub struct StatusResult {
pub ready: bool,
pub message: String,
}
impl BidiCommand for Status {
const METHOD: &'static str = "session.status";
type Returns = StatusResult;
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct Subscribe {
pub events: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub contexts: Vec<BrowsingContextId>,
#[serde(rename = "userContexts", skip_serializing_if = "Vec::is_empty")]
pub user_contexts: Vec<UserContextId>,
}
impl BidiCommand for Subscribe {
const METHOD: &'static str = "session.subscribe";
type Returns = SubscribeResult;
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubscribeResult {
#[serde(default)]
pub subscription: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct Unsubscribe {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub events: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub subscriptions: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub contexts: Vec<BrowsingContextId>,
}
impl BidiCommand for Unsubscribe {
const METHOD: &'static str = "session.unsubscribe";
type Returns = Empty;
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct End;
impl BidiCommand for End {
const METHOD: &'static str = "session.end";
type Returns = Empty;
}
#[derive(Debug)]
pub struct SessionModule<'a> {
bidi: &'a BiDi,
}
impl<'a> SessionModule<'a> {
pub(crate) fn new(bidi: &'a BiDi) -> Self {
Self {
bidi,
}
}
pub async fn status(&self) -> Result<StatusResult, BidiError> {
self.bidi.send(Status).await
}
pub async fn subscribe(&self, event: impl Into<String>) -> Result<SubscribeResult, BidiError> {
self.bidi
.send(Subscribe {
events: vec![event.into()],
contexts: vec![],
user_contexts: vec![],
})
.await
}
pub async fn subscribe_many(
&self,
events: impl IntoIterator<Item = String>,
) -> Result<SubscribeResult, BidiError> {
self.bidi
.send(Subscribe {
events: events.into_iter().collect(),
contexts: vec![],
user_contexts: vec![],
})
.await
}
pub async fn unsubscribe(
&self,
events: impl IntoIterator<Item = String>,
) -> Result<(), BidiError> {
self.bidi
.send(Unsubscribe {
events: events.into_iter().collect(),
subscriptions: vec![],
contexts: vec![],
})
.await?;
Ok(())
}
pub async fn end(&self) -> Result<(), BidiError> {
self.bidi.send(End).await?;
Ok(())
}
}