Skip to content

Commit 5cf899f

Browse files
committed
fix works
1 parent ba417d3 commit 5cf899f

File tree

4 files changed

+89
-17
lines changed

4 files changed

+89
-17
lines changed

src/web/crate_details.rs

+62-10
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ pub(crate) async fn crate_details_handler(
454454
struct ReleaseList {
455455
releases: Vec<Release>,
456456
crate_name: String,
457+
inner_path: String,
458+
target: String,
457459
}
458460

459461
impl_axum_webpage! {
@@ -464,35 +466,85 @@ impl_axum_webpage! {
464466

465467
#[tracing::instrument]
466468
pub(crate) async fn get_all_releases(
467-
Path(params): Path<CrateDetailHandlerParams>,
469+
Path(params): Path<RustdocHtmlParams>,
468470
Extension(pool): Extension<Pool>,
469471
) -> AxumResult<AxumResponse> {
470-
let releases: Vec<Release> = spawn_blocking({
472+
let req_path: String = params.path.clone().unwrap_or_default();
473+
let req_path: Vec<&str> = req_path.split('/').collect();
474+
475+
let release_found = match_version_axum(&pool, &params.name, Some(&params.version)).await?;
476+
trace!(?release_found, "found release");
477+
478+
let (version, _) = match release_found.version {
479+
MatchSemver::Exact((version, _)) => (version.clone(), version),
480+
MatchSemver::Latest((version, _)) => (version, "latest".to_string()),
481+
MatchSemver::Semver(_) => return Err(AxumNope::VersionNotFound),
482+
};
483+
484+
let (doc_targets, releases): (Vec<String>, Vec<Release>) = spawn_blocking({
471485
let pool = pool.clone();
472486
let params = params.clone();
473487
move || {
474488
let mut conn = pool.get()?;
475489
let query = "
476-
SELECT
477-
crates.id AS crate_id
478-
FROM crates
479-
WHERE crates.name = $1;";
490+
SELECT
491+
crates.id AS crate_id,
492+
releases.doc_targets
493+
FROM crates
494+
INNER JOIN releases on crates.id = releases.crate_id
495+
WHERE crates.name = $1 and releases.version = $2;";
480496

481-
let rows = conn.query(query, &[&params.name])?;
497+
let rows = conn.query(query, &[&params.name, &version])?;
482498

483499
let result = if rows.is_empty() {
484-
return Ok(Vec::new());
500+
return Err(AxumNope::CrateNotFound.into());
485501
} else {
486502
&rows[0]
487503
};
488-
// get releases, sorted by semver
489-
releases_for_crate(&mut *conn, result.get("crate_id"))
504+
505+
Ok((
506+
MetaData::parse_doc_targets(result.get("doc_targets")),
507+
// get releases, sorted by semver
508+
releases_for_crate(&mut *conn, result.get("crate_id"))?,
509+
))
490510
}
491511
})
492512
.await?;
493513

514+
let inner;
515+
let (target, inner_path) = {
516+
let mut inner_path = req_path.clone();
517+
518+
let target = if inner_path.len() > 1
519+
&& doc_targets
520+
.iter()
521+
.any(|s| Some(s) == params.target.as_ref())
522+
{
523+
inner_path.remove(0);
524+
params.target.as_ref().unwrap()
525+
} else {
526+
""
527+
};
528+
529+
inner = inner_path.join("/");
530+
(target, inner.trim_end_matches('/'))
531+
};
532+
let inner_path = if inner_path.is_empty() {
533+
format!("{}/index.html", params.name)
534+
} else {
535+
format!("{}/{inner_path}", params.name)
536+
};
537+
538+
let target = if target.is_empty() {
539+
String::new()
540+
} else {
541+
format!("{target}/")
542+
};
543+
494544
let res = ReleaseList {
495545
releases,
546+
target: target.to_string(),
547+
inner_path,
496548
crate_name: params.name,
497549
};
498550
Ok(res.into_response())

src/web/routes.rs

+12
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,22 @@ pub(super) fn build_axum_routes() -> AxumRouter {
276276
"/crate/:name/:version/menus/platforms/:target/",
277277
get_internal(super::crate_details::get_all_platforms),
278278
)
279+
.route(
280+
"/crate/:name/:version/menus/releases/:target",
281+
get_internal(super::crate_details::get_all_releases),
282+
)
283+
.route(
284+
"/crate/:name/:version/menus/releases/:target/*path",
285+
get_internal(super::crate_details::get_all_releases),
286+
)
279287
.route(
280288
"/crate/:name/:version/menus/releases",
281289
get_internal(super::crate_details::get_all_releases),
282290
)
291+
.route(
292+
"/crate/:name/:version/menus/releases/:target/",
293+
get_internal(super::crate_details::get_all_releases),
294+
)
283295
.route(
284296
"/-/rustdoc.static/*path",
285297
get_internal(super::rustdoc::static_asset_handler),

static/menu.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,28 @@ function loadAjaxMenu(menu, id, msg, path, extra) {
9393
currentMenu = newMenu;
9494
newMenu.className += " pure-menu-active";
9595
backdrop.style.display = "block";
96+
97+
const parts = window.location.pathname.split("/");
98+
const startFrom = parts[1] === "crate" ? 4 : 3;
99+
// We get everything except the first crate name and the version.
100+
const innerPath = "/" + parts.slice(startFrom).join("/")
101+
96102
if (newMenu.querySelector("#releases-list")) {
97-
loadAjaxMenu(newMenu, "releases-list", "release list", "releases", "");
103+
loadAjaxMenu(
104+
newMenu,
105+
"releases-list",
106+
"release list",
107+
"releases",
108+
innerPath,
109+
);
110+
98111
} else if (newMenu.querySelector("#platforms")) {
99-
const parts = window.location.pathname.split("/");
100-
const startFrom = parts[1] === "crate" ? 4 : 3;
101112
loadAjaxMenu(
102113
newMenu,
103114
"platforms",
104115
"platforms list",
105116
"platforms",
106-
// We get everything except the first crate name and the version.
107-
"/" + parts.slice(startFrom).join("/")
117+
innerPath,
108118
);
109119
}
110120
}

templates/rustdoc/releases.html

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
{% import "macros.html" as macros %}
2-
{% set target = "" %}
3-
{% set inner_path = releases[0].target_name ~ "/index.html" %}
42
<ul class="pure-menu-list">
53
{{ macros::releases_list(name=crate_name, releases=releases, target=target, inner_path=inner_path) }}
64
</ul>

0 commit comments

Comments
 (0)