1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* Copyright 2019-2020 Eric S. Londres
This program is free software. you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


fn render_joke(res: String) -> String {
    if let Ok(json::JsonValue::Object(o)) = json::parse(res.as_str()) {
	if let Some(t) = o["type"].as_str() {
	    match t {
		"single" => format!("{}", o["joke"]),
		"twopart" => format!("{}\n{}", o["setup"], o["delivery"]),
		_ => "".to_string()
	    }
	} else {
	    panic!("Could not find type")
	}
    } else {
	panic!("Could not parse JSON")
    }
}

pub fn get_joke() -> String {
    let res = reqwest::blocking::get("https://sv443.net/jokeapi/v2/joke/Any");
    match res {
	Ok(r) => render_joke(r.text().unwrap()),
	Err(e) => panic!("{}", e.to_string())
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        crate::get_joke();
    }
}