1use serde_json::{json, Value};
2
3use crate::client::Client;
4use crate::error::{Error, Result};
5use crate::types::BrowserSession;
6
7pub struct Sessions<'a> {
10 client: &'a Client,
11}
12
13impl<'a> Sessions<'a> {
14 pub(crate) fn new(client: &'a Client) -> Self {
15 Self { client }
16 }
17
18 pub async fn list(&self) -> Result<Vec<BrowserSession>> {
20 let v: Value = self.client.send_json(reqwest::Method::GET, "/browser-sessions", None).await?;
21 let arr = v.get("sessions").cloned().unwrap_or(v);
22 serde_json::from_value(arr).map_err(|e| Error::Other(format!("decode response: {e}")))
23 }
24
25 pub async fn create(&self, name: &str, description: Option<&str>) -> Result<BrowserSession> {
27 let mut body = json!({ "name": name });
28 if let Some(d) = description {
29 body["description"] = Value::String(d.to_string());
30 }
31 let v: Value = self.client.send_json(reqwest::Method::POST, "/browser-sessions", Some(body)).await?;
32 serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
33 }
34
35 pub async fn save(&self, session_id: &str, name: Option<&str>, description: Option<&str>) -> Result<BrowserSession> {
37 let mut body = serde_json::Map::new();
38 if let Some(n) = name { body.insert("name".into(), Value::String(n.to_string())); }
39 if let Some(d) = description { body.insert("description".into(), Value::String(d.to_string())); }
40 let path = format!("/browser-sessions/{session_id}/save");
41 let v: Value = self.client.send_json(reqwest::Method::POST, &path, Some(Value::Object(body))).await?;
42 serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
43 }
44
45 pub async fn update(&self, session_id: &str, name: Option<&str>, description: Option<&str>) -> Result<BrowserSession> {
47 let mut body = serde_json::Map::new();
48 if let Some(n) = name { body.insert("name".into(), Value::String(n.to_string())); }
49 if let Some(d) = description { body.insert("description".into(), Value::String(d.to_string())); }
50 let path = format!("/browser-sessions/{session_id}");
51 let v: Value = self.client.send_json(reqwest::Method::PUT, &path, Some(Value::Object(body))).await?;
52 serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
53 }
54
55 pub async fn delete(&self, session_id: &str) -> Result<()> {
57 let path = format!("/browser-sessions/{session_id}");
58 let _: Value = self.client.send_json(reqwest::Method::DELETE, &path, None).await?;
59 Ok(())
60 }
61}