Skip to content

Commit e9ec525

Browse files
joshtriplettjyn514
authored andcommitted
Support querying crate contents with cratename::some::path
This also makes searches such as `!docsrs cratename::some::path` work.
1 parent d226151 commit e9ec525

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

src/web/releases.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -554,31 +554,43 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
554554
let mut conn = extension!(req, Pool).get()?;
555555

556556
// check if I am feeling lucky button pressed and redirect user to crate page
557-
// if there is a match
558-
if params.contains_key("i-am-feeling-lucky") {
557+
// if there is a match. Also check for paths to items within crates.
558+
if params.contains_key("i-am-feeling-lucky") || query.contains("::") {
559559
// redirect to a random crate if query is empty
560560
if query.is_empty() {
561561
return redirect_to_random_crate(req, &mut conn);
562562
}
563+
564+
let (krate, query) = match query.split_once("::") {
565+
Some((krate, query)) => (krate.to_string(), format!("?query={query}")),
566+
None => (query.clone(), "".to_string()),
567+
};
568+
563569
// since we never pass a version into `match_version` here, we'll never get
564570
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
565571
// matter
566-
if let Ok(matchver) = match_version(&mut conn, &query, None) {
572+
if let Ok(matchver) = match_version(&mut conn, &krate, None) {
567573
let (version, _) = matchver.version.into_parts();
568-
let query = matchver.corrected_name.unwrap_or_else(|| query.to_string());
574+
let krate = matchver.corrected_name.unwrap_or(krate);
569575

570576
let url = if matchver.rustdoc_status {
571577
ctry!(
572578
req,
573-
Url::parse(&format!("{}/{}/{}/", redirect_base(req), query, version)),
579+
Url::parse(&format!(
580+
"{}/{}/{}/{}",
581+
redirect_base(req),
582+
krate,
583+
version,
584+
query
585+
)),
574586
)
575587
} else {
576588
ctry!(
577589
req,
578590
Url::parse(&format!(
579591
"{}/crate/{}/{}",
580592
redirect_base(req),
581-
query,
593+
krate,
582594
version,
583595
)),
584596
)

0 commit comments

Comments
 (0)