15
15
//! ```
16
16
use std:: str:: FromStr ;
17
17
18
+ use anyhow:: Context ;
18
19
use clap:: { Parser , Subcommand } ;
19
20
use reqwest:: Url ;
20
21
use torrust_tracker:: shared:: bit_torrent:: info_hash:: InfoHash ;
@@ -37,24 +38,25 @@ enum Command {
37
38
}
38
39
39
40
#[ tokio:: main]
40
- async fn main ( ) {
41
+ async fn main ( ) -> anyhow :: Result < ( ) > {
41
42
let args = Args :: parse ( ) ;
42
43
43
44
match args. command {
44
45
Command :: Announce { tracker_url, info_hash } => {
45
- announce_command ( tracker_url, info_hash) . await ;
46
+ announce_command ( tracker_url, info_hash) . await ? ;
46
47
}
47
48
Command :: Scrape {
48
49
tracker_url,
49
50
info_hashes,
50
51
} => {
51
- scrape_command ( & tracker_url, & info_hashes) . await ;
52
+ scrape_command ( & tracker_url, & info_hashes) . await ? ;
52
53
}
53
54
}
55
+ Ok ( ( ) )
54
56
}
55
57
56
- async fn announce_command ( tracker_url : String , info_hash : String ) {
57
- let base_url = Url :: parse ( & tracker_url) . expect ( "Invalid HTTP tracker base URL") ;
58
+ async fn announce_command ( tracker_url : String , info_hash : String ) -> anyhow :: Result < ( ) > {
59
+ let base_url = Url :: parse ( & tracker_url) . context ( "failed to parse HTTP tracker base URL") ? ;
58
60
let info_hash =
59
61
InfoHash :: from_str ( & info_hash) . expect ( "Invalid infohash. Example infohash: `9c38422213e30bff212b30c360d26f9a02136422`" ) ;
60
62
@@ -67,16 +69,17 @@ async fn announce_command(tracker_url: String, info_hash: String) {
67
69
let announce_response: Announce = serde_bencode:: from_bytes ( & body)
68
70
. unwrap_or_else ( |_| panic ! ( "response body should be a valid announce response, got: \" {:#?}\" " , & body) ) ;
69
71
70
- let json = serde_json:: to_string ( & announce_response) . expect ( "announce response should be a valid JSON") ;
72
+ let json = serde_json:: to_string ( & announce_response) . context ( "failed to serialize scrape response into JSON") ? ;
71
73
72
74
println ! ( "{json}" ) ;
75
+
76
+ Ok ( ( ) )
73
77
}
74
78
75
- async fn scrape_command ( tracker_url : & str , info_hashes : & [ String ] ) {
76
- let base_url = Url :: parse ( tracker_url) . expect ( "Invalid HTTP tracker base URL") ;
79
+ async fn scrape_command ( tracker_url : & str , info_hashes : & [ String ] ) -> anyhow :: Result < ( ) > {
80
+ let base_url = Url :: parse ( tracker_url) . context ( "failed to parse HTTP tracker base URL") ? ;
77
81
78
- let query = requests:: scrape:: Query :: try_from ( info_hashes)
79
- . expect ( "All infohashes should be valid. Example infohash: `9c38422213e30bff212b30c360d26f9a02136422`" ) ;
82
+ let query = requests:: scrape:: Query :: try_from ( info_hashes) . context ( "failed to parse infohashes" ) ?;
80
83
81
84
let response = Client :: new ( base_url) . scrape ( & query) . await ;
82
85
@@ -85,7 +88,9 @@ async fn scrape_command(tracker_url: &str, info_hashes: &[String]) {
85
88
let scrape_response = scrape:: Response :: try_from_bencoded ( & body)
86
89
. unwrap_or_else ( |_| panic ! ( "response body should be a valid scrape response, got: \" {:#?}\" " , & body) ) ;
87
90
88
- let json = serde_json:: to_string ( & scrape_response) . expect ( "scrape response should be a valid JSON") ;
91
+ let json = serde_json:: to_string ( & scrape_response) . context ( "failed to serialize scrape response into JSON") ? ;
89
92
90
93
println ! ( "{json}" ) ;
94
+
95
+ Ok ( ( ) )
91
96
}
0 commit comments