1use std::result::Result;
2use std::error::Error;
3use reqwest::Client;
4use serde::Serialize;
5use serde_json::Value;
6use super::capabilities::*;
7use super::errors::{ResponseError};
8
9#[derive(Serialize)]
10struct CapabilitiesContainer<'a> {
11 capabilities: MatchContainer<'a>
12}
13
14impl<'a> CapabilitiesContainer<'a> {
15 fn new(capabilities: &'a Capabilities) -> CapabilitiesContainer<'a> {
16 CapabilitiesContainer {
17 capabilities: MatchContainer {
18 always_math: capabilities
19 }
20 }
21 }
22}
23
24#[derive(Serialize)]
25struct MatchContainer<'a> {
26 #[serde(rename = "alwaysMatch")]
27 always_math: &'a Capabilities<'a>,
28}
29
30pub struct Session<'a> {
31 server_address: String,
32 session_id: String,
33 pub timeout: &'a Timeout,
34}
35
36impl<'a> Session<'a> {
37 pub fn new_session<'b>(server_address: &str, browser_capabilities: &'b Capabilities) -> Result<Session<'b>, Box<Error>> {
38 let capabilities_json = serde_json::to_string(&CapabilitiesContainer::new(browser_capabilities)).unwrap(); dbg!(&capabilities_json);
41
42 let client = Client::new();
43 let mut response = client
44 .post((server_address.to_owned() + "/session").as_str())
45 .body(capabilities_json)
46 .send()?;
47
48 let json_data = &response.text()?;
49 dbg!(json_data);
50 let result: Value = serde_json::from_str(json_data.as_str())?;
51 dbg!(&result);
52 return Ok(Session {
53 server_address: server_address.to_owned(),
54 session_id: result["value"]["sessionId"].as_str().unwrap().to_owned(),
55 timeout: browser_capabilities.timeouts.clone(),
56 });
57 }
58
59 pub fn set_timeouts(&mut self, timeouts: &Timeout) -> Result<(), Box<Error>> {
60 let client = Client::new();
61 let url = format!("{}/session/{}/timeouts", self.server_address, self.session_id);
62 let serialized_timeouts = serde_json::to_string(timeouts)?;
63
64 client
65 .post(&url)
66 .body(serialized_timeouts)
67 .send()?;
68
69 Ok(())
70 }
71
72 pub fn current_url(&self) -> Result<String, Box<Error>> {
73 let client = Client::new();
74 let url = format!("{}/session/{}/url", self.server_address, self.session_id);
75 let mut response = client
76 .get(&url)
77 .send()?;
78 let response_deserialized: Value = serde_json::from_str(&response.text()?)?;
79 let current_url = response_deserialized["value"].as_str();
80 return match current_url {
81 Some(url) => {
82 return Ok(url.to_owned());
83 }
84 _ => Err(Box::new(
85 ResponseError{
86 description: "Value in json was null".to_owned(),
87 side: None,
88 }
89 ))
90 };
91 }
92
93 pub fn navigate(&self,url: &str) -> Result<(),Box<Error>> {
94 #[derive(Serialize)]
95 struct RequestData<'a> {
96 url: &'a str
97 }
98
99 let client = Client::new();
100 let request_data = RequestData{url};
101 let url = format!("{}/session/{}/url", self.server_address, self.session_id);
102
103 client
104 .post(&url)
105 .body(serde_json::to_string(&request_data)?)
106 .send()?;
107
108 Ok(())
109 }
110
111 pub fn refresh(&self) -> Result<(),Box<Error>> {
112 let client = Client::new();
113 let url = format!("{}/session/{}/refresh",self.server_address,self.session_id);
114 client
115 .post(&url)
116 .send()?;
117
118 Ok(())
119 }
120
121 pub fn navigate_back(&self) -> Result<(),Box<Error>> {
122 let client = Client::new();
123 let url = format!("{}/session/{}/back",self.server_address,self.session_id);
124 client
125 .post(&url)
126 .send()?;
127
128 Ok(())
129 }
130}
131
132impl<'a> Drop for Session<'a> {
133 fn drop(&mut self) {
134 let request_url = format!("{}/session/{}", self.server_address, self.session_id);
135 reqwest::Client::new().delete(request_url.as_str()).send();
136 }
137}