Skip to content

add support for default-target #224

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 27 additions & 8 deletions src/web/rustdoc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,14 +98,33 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {

// get target name
// FIXME: This is a bit inefficient but allowing us to use less code in general
let target_name: String =
ctry!(conn.query("SELECT target_name
FROM releases
INNER JOIN crates ON crates.id = releases.crate_id
WHERE crates.name = $1 AND releases.version = $2",
&[&crate_name, &version]))
.get(0)
.get(0);
let target_name: String = {
fn targets_contains(doc_targets: &Json, default_target: &str) -> bool {
doc_targets.as_array().map_or(false, |tgts| {
tgts.iter().any(|t| t.as_string() == Some(default_target))
})
}

let query = ctry!(conn.query("SELECT target_name, default_target, doc_targets
FROM releases
INNER JOIN crates ON crates.id = releases.crate_id
WHERE crates.name = $1 AND releases.version = $2",
&[&crate_name, &version]));
let row = query.get(0);

let (target, default, doc_targets): (String, Option<String>, Json) =
(row.get(0), row.get(1), row.get(2));

if let Some(default) = default {
if targets_contains(&doc_targets, &default) {
format!("{}/{}", default, target)
} else {
target
}
} else {
target
}
};

redirect_to_doc(req, &crate_name, &version, &target_name)
}
Expand Down