1use reqwest::blocking::Client;
3use reqwest::StatusCode;
4use serde::{Serialize, Deserialize};
5use std::error::Error;
6
7
8#[derive(Serialize, Deserialize, Debug)]
10pub struct TweetText {
11 pub text: String
12}
13
14
15
16
17
18pub struct TweetCreateData {
20 pub data: TweetIDandText,
21 pub code: Status
22}
23#[derive(Serialize, Deserialize, Debug)]
24pub struct TweetJsonCreateData {
25 pub data: TweetIDandText,
26}
27#[derive(Serialize, Deserialize, Debug)]
28pub struct TweetIDandText {
29 pub id: String,
30 pub text: String
31}
32
33
34
35pub enum Status {
37 Forbidden,
38 Created,
39 Unauthorized,
40 None
41}
42
43
44
45
46
47pub struct Bot {
49 pub access_token: String
50}
51
52impl Bot {
53 pub fn new(access_token: &str) -> Bot {
54 Bot {access_token: access_token.to_string()}
55 }
56 pub fn send_message(self, text: &str) -> Result<TweetCreateData, Box<dyn Error>> {
57 let text = TweetText {text: text.to_string()};
59 let serialized_text = serde_json::to_string(&text).unwrap();
60
61 let result = Client::new()
63 .post("https://api.twitter.com/2/tweets")
64 .header("Content-type", "application/json")
65 .header("Authorization", format!("Bearer {}", self.access_token))
66 .body(serialized_text)
67 .send();
68
69
70 let returner: TweetCreateData = match result {
72 Ok(response) => {
73 if response.status() == StatusCode::CREATED {
74 let temp_response = response.text()?;
75 let json: TweetJsonCreateData = serde_json::from_str(&temp_response)?;
76
77 TweetCreateData {data: json.data, code: Status::Created}
78 } else if response.status() == StatusCode::FORBIDDEN {
79 let json = TweetIDandText {id: "None".to_string(), text: "Could not create Tweet due to wrong access token!".to_string()};
80 TweetCreateData {data: json, code: Status::Forbidden}
81 } else if response.status() == StatusCode::UNAUTHORIZED {
82 let json = TweetIDandText {id: "None".to_string(), text: "Not allowed to create a Tweet with duplicate content.".to_string()};
83 TweetCreateData {data: json, code: Status::Unauthorized}
84 } else {
85 let json = TweetIDandText {id: "None".to_string(), text: "Something unexpected happened!".to_string()};
86 TweetCreateData {data: json, code: Status::None}
87 }
88 }
89 Err(_err) => {
90 let json = TweetIDandText {id: "None".to_string(), text: "Something unexpected happened!".to_string()};
91 TweetCreateData {data: json, code: Status::None}
92 }
93 };
94
95 Ok(returner)
97
98 }
99}