use std::collections::HashMap; use serde::{Deserialize, Serialize}; use specta::Type; use crate::{gateway::Gateway, gp_params::ClientOs}; use super::vpn_state::ConnectInfo; #[derive(Debug, Deserialize, Serialize)] pub struct LaunchGuiRequest { user: String, envs: HashMap, } impl LaunchGuiRequest { pub fn new(user: String, envs: HashMap) -> Self { Self { user, envs } } pub fn user(&self) -> &str { &self.user } pub fn envs(&self) -> &HashMap { &self.envs } } #[derive(Debug, Deserialize, Serialize, Type)] pub struct ConnectArgs { cookie: String, vpnc_script: Option, user_agent: Option, os: Option, } impl ConnectArgs { pub fn new(cookie: String) -> Self { Self { cookie, vpnc_script: None, user_agent: None, os: None, } } pub fn cookie(&self) -> &str { &self.cookie } pub fn vpnc_script(&self) -> Option { self.vpnc_script.clone() } pub fn user_agent(&self) -> Option { self.user_agent.clone() } pub fn openconnect_os(&self) -> Option { self .os .as_ref() .map(|os| os.to_openconnect_os().to_string()) } } #[derive(Debug, Deserialize, Serialize, Type)] pub struct ConnectRequest { info: ConnectInfo, args: ConnectArgs, } impl ConnectRequest { pub fn new(info: ConnectInfo, cookie: String) -> Self { Self { info, args: ConnectArgs::new(cookie), } } pub fn with_vpnc_script>>(mut self, vpnc_script: T) -> Self { self.args.vpnc_script = vpnc_script.into(); self } pub fn with_user_agent>>(mut self, user_agent: T) -> Self { self.args.user_agent = user_agent.into(); self } pub fn with_os>>(mut self, os: T) -> Self { self.args.os = os.into(); self } pub fn gateway(&self) -> &Gateway { self.info.gateway() } pub fn info(&self) -> &ConnectInfo { &self.info } pub fn args(&self) -> &ConnectArgs { &self.args } } #[derive(Debug, Deserialize, Serialize, Type)] pub struct DisconnectRequest; /// Requests that can be sent to the service #[derive(Debug, Deserialize, Serialize)] pub enum WsRequest { Connect(Box), Disconnect(DisconnectRequest), }