tweety/
lib.rs

1// all "use" statements here
2use reqwest::blocking::Client;
3use reqwest::StatusCode;
4use serde::{Serialize, Deserialize};
5use std::error::Error;
6
7
8// Structure that has to do with the structure that creates a tweet
9#[derive(Serialize, Deserialize, Debug)]
10pub struct TweetText {
11    pub text: String
12}
13
14
15
16
17
18// Main strucutures including data from tweet creation response
19pub 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
35// Tweet creations status
36pub enum Status {
37    Forbidden,
38    Created,
39    Unauthorized,
40    None
41}
42
43
44
45
46
47// Main strucutre
48pub 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        // serializes the text
58        let text = TweetText {text: text.to_string()};
59        let serialized_text = serde_json::to_string(&text).unwrap();
60        
61        // sends request to twitter
62        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        // generates rust response
71        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        // return struct
96        Ok(returner)
97        
98    } 
99}