@@ -80,23 +80,31 @@ fn rustc_crate(crate_name: &str) -> Option<&str> {
80
80
}
81
81
82
82
pub fn doc_search ( args : Args ) -> Result < ( ) > {
83
- let crate_name = args
83
+ let query = args
84
84
. params
85
85
. get ( "query" )
86
86
. ok_or ( "Unable to retrieve param: query" ) ?;
87
87
88
- if crate_name . contains ( "::" ) {
89
- let message = "`?docs` cannot retrieve documentation for items within a crate." ;
90
- api :: send_reply ( & args , message ) ? ;
91
- } else if let Some ( rustc_crate) = rustc_crate ( crate_name) {
92
- api :: send_reply ( & args , rustc_crate) ? ;
88
+ let mut query_iter = query . splitn ( 2 , "::" ) ;
89
+ let crate_name = query_iter . next ( ) . unwrap ( ) ;
90
+
91
+ let doc_url = if let Some ( rustc_crate) = rustc_crate ( crate_name) {
92
+ Some ( rustc_crate. to_string ( ) )
93
93
} else if let Some ( krate) = get_crate ( & args) ? {
94
94
let name = krate. name ;
95
- let message = krate
95
+ krate
96
96
. documentation
97
- . unwrap_or_else ( || format ! ( "https://docs.rs/{}" , name) ) ;
97
+ . or_else ( || Some ( format ! ( "https://docs.rs/{}" , name) ) )
98
+ } else {
99
+ None
100
+ } ;
101
+
102
+ if let Some ( mut url) = doc_url {
103
+ if let Some ( item_path) = query_iter. next ( ) {
104
+ url += & format ! ( "?search={}" , item_path) ;
105
+ }
98
106
99
- api:: send_reply ( & args, & message ) ?;
107
+ api:: send_reply ( & args, & url ) ?;
100
108
} else {
101
109
let message = "No crates found." ;
102
110
api:: send_reply ( & args, message) ?;
0 commit comments