Skip to content

Commit 0d45c8b

Browse files
GuillaumeGomezsyphar
authored andcommitted
Display crates not available on docs.rs in search results
1 parent a96a6d4 commit 0d45c8b

File tree

4 files changed

+85
-54
lines changed

4 files changed

+85
-54
lines changed

src/web/releases.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,15 @@ pub(crate) async fn get_releases(
130130
.await?)
131131
}
132132

133+
#[derive(Debug, Clone, PartialEq, Eq)]
134+
pub(crate) enum ReleaseStatus {
135+
Available(Release),
136+
/// Only contains the crate name.
137+
NotAvailable(String),
138+
}
139+
133140
struct SearchResult {
134-
pub results: Vec<Release>,
141+
pub results: Vec<ReleaseStatus>,
135142
pub prev_page: Option<String>,
136143
pub next_page: Option<String>,
137144
}
@@ -160,7 +167,7 @@ async fn get_search_results(
160167
// So for now we are using the version with the youngest release_time.
161168
// This is different from all other release-list views where we show
162169
// our latest build.
163-
let crates: HashMap<String, Release> = sqlx::query!(
170+
let mut crates: HashMap<String, Release> = sqlx::query!(
164171
r#"SELECT
165172
crates.name,
166173
releases.version,
@@ -206,14 +213,21 @@ async fn get_search_results(
206213
.try_collect()
207214
.await?;
208215

216+
let names: Vec<String> =
217+
Arc::into_inner(names).expect("Arc still borrowed in `get_search_results`");
209218
Ok(SearchResult {
210219
// start with the original names from crates.io to keep the original ranking,
211220
// extend with the release/build information from docs.rs
212221
// Crates that are not on docs.rs yet will not be returned.
213222
results: names
214-
.iter()
215-
.filter_map(|name| crates.get(name))
216-
.cloned()
223+
.into_iter()
224+
.map(|name| {
225+
if let Some(release) = crates.remove(&name) {
226+
ReleaseStatus::Available(release)
227+
} else {
228+
ReleaseStatus::NotAvailable(name)
229+
}
230+
})
217231
.collect(),
218232
prev_page: meta.prev_page,
219233
next_page: meta.next_page,
@@ -269,7 +283,7 @@ pub(crate) async fn releases_feed_handler(mut conn: DbConnection) -> AxumResult<
269283
#[template(path = "releases/releases.html")]
270284
#[derive(Debug, Clone, PartialEq, Eq)]
271285
struct ViewReleases {
272-
releases: Vec<Release>,
286+
releases: Vec<ReleaseStatus>,
273287
description: String,
274288
release_type: ReleaseType,
275289
show_next_page: bool,
@@ -355,7 +369,10 @@ pub(crate) async fn releases_handler(
355369
);
356370

357371
Ok(ViewReleases {
358-
releases,
372+
releases: releases
373+
.into_iter()
374+
.map(ReleaseStatus::Available)
375+
.collect::<Vec<_>>(),
359376
description: description.into(),
360377
release_type,
361378
show_next_page,
@@ -407,7 +424,7 @@ pub(crate) async fn owner_handler(Path(owner): Path<String>) -> AxumResult<impl
407424
#[derive(Debug, Clone, PartialEq)]
408425
pub(super) struct Search {
409426
pub(super) title: String,
410-
pub(super) releases: Vec<Release>,
427+
pub(super) releases: Vec<ReleaseStatus>,
411428
pub(super) search_query: Option<String>,
412429
pub(super) search_sort_by: Option<String>,
413430
pub(super) previous_page_link: Option<String>,

templates/releases/releases.html

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -30,54 +30,64 @@
3030
<ul>
3131
{# TODO: If there are no releases, then display a message that says so #}
3232
{%- for release in releases -%}
33-
{%- set release_version -%}
34-
{%- set has_unyanked_releases = release.has_unyanked_releases.unwrap_or(true) -%}
35-
{%- if release_type == "search" && has_unyanked_releases -%}
36-
{%- set release_version = "latest" -%}
37-
{%- else -%}
38-
{%- set release_version = release.version -%}
39-
{%- endif -%}
40-
{% set link %}
41-
{%- if release.rustdoc_status -%}
42-
{% set link = "/{}/{}/{}/"|format(release.name, release_version, release.target_name.as_deref().unwrap_or_default()) -%}
43-
{%- else -%}
44-
{% set link = "/crate/{}/{}"|format(release.name, release_version) -%}
45-
{%- endif -%}
4633
<li>
47-
<a href="{{ link|safe }}" class="release">
48-
<div class="pure-g">
49-
<div class="pure-u-1 pure-u-sm-6-24 pure-u-md-5-24 name">
50-
{{ release.name }}-{{ release.version }}
51-
{% if !has_unyanked_releases %}
52-
<span class="yanked" title="all releases of {{ release.name }} have been yanked">
53-
{{ crate::icons::IconTrash.render_solid(false, false, "") }}
54-
Yanked
55-
</span>
56-
{% endif %}
57-
</div>
58-
59-
<div class="pure-u-1 pure-u-sm-14-24 pure-u-md-16-24 description">
60-
{{ release.description.as_deref().unwrap_or_default() }}
34+
{%- match release -%}
35+
{%- when ReleaseStatus::NotAvailable(name) -%}
36+
<div class="release">
37+
<div class="pure-g">
38+
<div class="pure-u-1 pure-u-sm-6-24 pure-u-md-5-24 name not-available">{{ name }}</div>
39+
<div class="pure-u-1 pure-u-sm-14-24 pure-u-md-16-24 description">Documentation not available on docs.rs</div>
6140
</div>
62-
63-
{% if release_type == "owner" -%}
64-
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date" {% if let Some(build_time) = release.build_time -%}
65-
title="Published {{ build_time|timeformat }}" {%- endif -%}>
66-
{{ release.stars }}
67-
{{ crate::icons::IconStar.render_solid(false, false, "") }}
68-
</div>
69-
{%- elif let Some(build_time) = release.build_time -%}
70-
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date"
71-
title="{{ build_time.format("%FT%TZ") }}">
72-
{{ build_time|timeformat }}
41+
</div>
42+
{%- when ReleaseStatus::Available(release) -%}
43+
{%- set release_version -%}
44+
{%- set has_unyanked_releases = release.has_unyanked_releases.unwrap_or(true) -%}
45+
{%- if release_type == "search" && has_unyanked_releases -%}
46+
{%- set release_version = "latest" -%}
47+
{%- else -%}
48+
{%- set release_version = release.version -%}
49+
{%- endif -%}
50+
{% set link %}
51+
{%- if release.rustdoc_status -%}
52+
{% set link = "/{}/{}/{}/"|format(release.name, release_version, release.target_name.as_deref().unwrap_or_default()) -%}
53+
{%- else -%}
54+
{% set link = "/crate/{}/{}"|format(release.name, release_version) -%}
55+
{%- endif -%}
56+
<a href="{{ link|safe }}" class="release">
57+
<div class="pure-g">
58+
<div class="pure-u-1 pure-u-sm-6-24 pure-u-md-5-24 name">
59+
{{- release.name }}-{{ release.version }}
60+
{%+ if !has_unyanked_releases -%}
61+
<span class="yanked" title="all releases of {{ release.name }} have been yanked">
62+
{{- crate::icons::IconTrash.render_solid(false, false, "") +}}
63+
Yanked
64+
</span>
65+
{%- endif -%}
7366
</div>
74-
{%- else -%}
75-
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date">
76-
&mdash;
67+
68+
<div class="pure-u-1 pure-u-sm-14-24 pure-u-md-16-24 description">
69+
{{- release.description.as_deref().unwrap_or_default() -}}
7770
</div>
78-
{%- endif %}
79-
</div>
80-
</a>
71+
72+
{%- if release_type == "owner" -%}
73+
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date" {% if let Some(build_time) = release.build_time -%}
74+
title="Published {{ build_time|timeformat }}" {%- endif -%}>
75+
{{- release.stars +}}
76+
{{ crate::icons::IconStar.render_solid(false, false, "") -}}
77+
</div>
78+
{%- elif let Some(build_time) = release.build_time -%}
79+
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date"
80+
title="{{ build_time.format("%FT%TZ") }}">
81+
{{- build_time|timeformat -}}
82+
</div>
83+
{%- else -%}
84+
<div class="pure-u-1 pure-u-sm-4-24 pure-u-md-3-24 date">
85+
&mdash;
86+
</div>
87+
{%- endif %}
88+
</div>
89+
</a>
90+
{%- endmatch -%}
8191
</li>
8292
{%- endfor -%}
8393
</ul>

templates/releases/search_results.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111
{%- endblock topbar -%}
1212

1313
{% block sort_by %}
14-
<div id="search-select-nav">
14+
<div id="search-select-nav">
1515
<div class="item-end">
1616
<span>Sort by</span>
1717
<label for="nav-sort">
1818
{{ crate::icons::IconList.render_solid(false, false, "") }}
1919
</label>
2020
{% set search_sort_by_val = search_sort_by.as_deref().unwrap_or_default() %}
21-
<select form="nav-search-form" name="sort" id="nav-sort" aria-label="Find crate by the sort by select-box" tabindex="-1">
21+
<select form="nav-search-form" name="sort" id="nav-sort" aria-label="Find crate by the sort by select-box" tabindex="-1">
2222
<option value="relevance" {%- if search_sort_by_val == "relevance" %} selected="selected" {%- endif %}>Relevance</option>
2323
<option value="downloads" {%- if search_sort_by_val == "downloads" %} selected="selected" {%- endif %}>All-Time Downloads</option>
2424
<option value="recent-downloads" {%- if search_sort_by_val == "recent-downloads" %} selected="selected" {%- endif %}>Recent Downloads</option>

templates/style/style.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,10 @@ div.recent-releases-container {
331331
}
332332
}
333333

334+
.name.not-available {
335+
color: var(--color-standard);
336+
}
337+
334338
.name:hover {
335339
overflow: visible;
336340
white-space: normal;

0 commit comments

Comments
 (0)