@@ -80,23 +80,31 @@ fn rustc_crate(crate_name: &str) -> Option<&str> {
8080}
8181
8282pub fn doc_search ( args : Args ) -> Result < ( ) > {
83- let crate_name = args
83+ let query = args
8484 . params
8585 . get ( "query" )
8686 . ok_or ( "Unable to retrieve param: query" ) ?;
8787
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 ( ) )
9393 } else if let Some ( krate) = get_crate ( & args) ? {
9494 let name = krate. name ;
95- let message = krate
95+ krate
9696 . 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+ }
98106
99- api:: send_reply ( & args, & message ) ?;
107+ api:: send_reply ( & args, & url ) ?;
100108 } else {
101109 let message = "No crates found." ;
102110 api:: send_reply ( & args, message) ?;
0 commit comments