use crate::body::{Body, BodyUpdate, BodyUpdateResult};
use crate::error::{ClientError, WebDynproError};
use crate::event::{
Event,
event_queue::{EnqueueEventResult, EventQueue},
};
use tokio::sync::Mutex;
use url::Url;
#[derive(Debug)]
pub struct WebDynproState {
base_url: Url,
name: String,
body: Body,
event_queue: Mutex<EventQueue>,
}
impl WebDynproState {
pub fn new(base_url: Url, name: String, body: Body) -> Self {
WebDynproState {
base_url,
name,
body,
event_queue: Mutex::new(EventQueue::new()),
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn base_url(&self) -> &Url {
&self.base_url
}
pub fn body(&self) -> &Body {
&self.body
}
pub fn client_url(&self) -> String {
let mut url = "".to_owned();
url.push_str(self.base_url().as_str());
if !url.ends_with('/') {
url.push('/');
}
url.push_str(self.name());
url.push_str("?sap-wd-stableids=X#");
url
}
pub fn mutate_body(&mut self, update: BodyUpdate) -> Result<BodyUpdateResult, WebDynproError> {
Ok(self.body.apply(update)?)
}
pub async fn add_event(&self, event: Event) -> EnqueueEventResult {
self.event_queue.lock().await.add(event)
}
pub async fn serialize_and_clear(&self) -> String {
self.event_queue.lock().await.serialize_and_clear()
}
pub async fn serialize_and_clear_with_form_event(&self) -> Result<String, ClientError> {
self.event_queue
.lock()
.await
.serialize_and_clear_with_form_event()
}
}
#[derive(Debug)]
pub struct SapSsrClient {
pub action: String,
pub charset: String,
pub wd_secure_id: String,
pub app_name: String,
pub use_beacon: bool,
}
impl SapSsrClient {
pub fn build_action_url(&self, base_url: &Url) -> Result<String, ClientError> {
let mut url = "".to_owned();
url.push_str(base_url.scheme());
url.push_str("://");
if let Some(host_str) = base_url.host_str() {
url.push_str(host_str);
} else {
return Err(ClientError::InvalidBaseUrl(base_url.to_string()));
}
if let Some(port) = base_url.port() {
url.push(':');
url.push_str(port.to_string().as_str());
}
url.push_str(self.action.as_str());
Ok(url)
}
}
pub enum EventProcessResult {
Enqueued,
Sent(BodyUpdateResult),
}