Skip to content

Commit c5a729f

Browse files
committed
use KrateName NewType in more places, introduce "confirmed name" to params
1 parent d3b25c7 commit c5a729f

File tree

4 files changed

+60
-22
lines changed

4 files changed

+60
-22
lines changed

src/db/types/krate_name.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ use std::{io::Write, str::FromStr};
1818
/// FIXME: this should actually come from some shared crate between the rust projects,
1919
/// so the amount of duplication is less.
2020
#[derive(
21-
Debug, Clone, PartialEq, Eq, Hash, Deref, Into, Display, DeserializeFromStr, SerializeDisplay,
21+
Debug,
22+
Clone,
23+
PartialEq,
24+
Eq,
25+
Hash,
26+
Deref,
27+
Into,
28+
Display,
29+
DeserializeFromStr,
30+
SerializeDisplay,
31+
bincode::Encode,
2232
)]
2333
pub struct KrateName(String);
2434

src/web/crate_details.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ use crate::{
22
AsyncStorage,
33
db::{
44
BuildId, CrateId, ReleaseId,
5-
types::{BuildStatus, dependencies::ReleaseDependencyList, version::Version},
5+
types::{
6+
BuildStatus, dependencies::ReleaseDependencyList, krate_name::KrateName,
7+
version::Version,
8+
},
69
},
710
impl_axum_webpage,
811
registry_api::OwnerKind,
@@ -36,7 +39,7 @@ use std::sync::Arc;
3639
// TODO: Add target name and versions
3740
#[derive(Debug, Clone, PartialEq)]
3841
pub(crate) struct CrateDetails {
39-
pub(crate) name: String,
42+
pub(crate) name: KrateName,
4043
pub(crate) version: Version,
4144
pub(crate) description: Option<String>,
4245
pub(crate) owners: Vec<(String, String, OwnerKind)>,
@@ -136,7 +139,7 @@ impl CrateDetails {
136139
r#"SELECT
137140
crates.id AS "crate_id: CrateId",
138141
releases.id AS "release_id: ReleaseId",
139-
crates.name,
142+
crates.name as "name: KrateName",
140143
releases.version,
141144
releases.description,
142145
releases.dependencies,
@@ -437,7 +440,7 @@ pub(crate) async fn releases_for_crate(
437440
#[template(path = "crate/details.html")]
438441
struct CrateDetailsPage {
439442
version: Version,
440-
name: String,
443+
name: KrateName,
441444
owners: Vec<(String, String, OwnerKind)>,
442445
metadata: MetaData,
443446
documented_items: Option<i32>,

src/web/extractors/rustdoc.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! special rustdoc extractors
22
33
use crate::{
4-
db::BuildId,
4+
db::{BuildId, types::krate_name::KrateName},
55
web::{
66
MatchedRelease, MetaData, ReqVersion, error::AxumNope, escaped_uri::EscapedURI,
77
extractors::Path, url_decode,
@@ -49,6 +49,7 @@ pub(crate) struct RustdocParams {
4949

5050
original_uri: Option<EscapedURI>,
5151
name: String,
52+
confirmed_name: Option<KrateName>,
5253
req_version: ReqVersion,
5354
doc_target: Option<String>,
5455
inner_path: Option<String>,
@@ -67,6 +68,7 @@ impl std::fmt::Debug for RustdocParams {
6768
.field("page_kind", &self.page_kind)
6869
.field("original_uri", &self.original_uri)
6970
.field("name", &self.name)
71+
.field("confirmed_name", &self.confirmed_name)
7072
.field("req_version", &self.req_version)
7173
.field("doc_target", &self.doc_target)
7274
.field("inner_path", &self.inner_path)
@@ -165,6 +167,7 @@ impl RustdocParams {
165167
pub(crate) fn new(name: impl Into<String>) -> Self {
166168
Self {
167169
name: name.into().trim().into(),
170+
confirmed_name: None,
168171
req_version: ReqVersion::default(),
169172
original_uri: None,
170173
doc_target: None,
@@ -199,11 +202,12 @@ impl RustdocParams {
199202
}
200203

201204
pub(crate) fn from_metadata(metadata: &MetaData) -> Self {
202-
RustdocParams::new(&metadata.name).apply_metadata(metadata)
205+
RustdocParams::new(metadata.name.to_string()).apply_metadata(metadata)
203206
}
204207

205208
pub(crate) fn apply_metadata(self, metadata: &MetaData) -> RustdocParams {
206-
self.with_name(&metadata.name)
209+
self.with_name(metadata.name.to_string())
210+
.with_confirmed_name(metadata.name.clone())
207211
.with_req_version(&metadata.req_version)
208212
// first set the doc-target list
209213
.with_maybe_doc_targets(metadata.doc_targets.clone())
@@ -213,12 +217,13 @@ impl RustdocParams {
213217
}
214218

215219
pub(crate) fn from_matched_release(matched_release: &MatchedRelease) -> Self {
216-
RustdocParams::new(&matched_release.name).apply_matched_release(matched_release)
220+
RustdocParams::new(matched_release.name.to_string()).apply_matched_release(matched_release)
217221
}
218222

219223
pub(crate) fn apply_matched_release(self, matched_release: &MatchedRelease) -> RustdocParams {
220224
let release = &matched_release.release;
221-
self.with_name(&matched_release.name)
225+
self.with_name(matched_release.name.to_string())
226+
.with_confirmed_name(matched_release.name.clone())
222227
.with_req_version(&matched_release.req_version)
223228
.with_maybe_doc_targets(release.doc_targets.as_deref())
224229
.with_maybe_default_target(release.default_target.as_deref())
@@ -235,6 +240,22 @@ impl RustdocParams {
235240
})
236241
}
237242

243+
pub(crate) fn confirmed_name(&self) -> Option<&KrateName> {
244+
self.confirmed_name.as_ref()
245+
}
246+
pub(crate) fn with_maybe_confirmed_name(
247+
self,
248+
confirmed_name: Option<impl Into<KrateName>>,
249+
) -> Self {
250+
self.update(|mut params| {
251+
params.confirmed_name = confirmed_name.map(Into::into);
252+
params
253+
})
254+
}
255+
pub(crate) fn with_confirmed_name(self, confirmed_name: impl Into<KrateName>) -> Self {
256+
self.with_maybe_confirmed_name(Some(confirmed_name))
257+
}
258+
238259
pub(crate) fn req_version(&self) -> &ReqVersion {
239260
&self.req_version
240261
}

src/web/mod.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub mod page;
55
use crate::{
66
db::{
77
CrateId,
8-
types::{BuildStatus, version::Version},
8+
types::{BuildStatus, krate_name::KrateName, version::Version},
99
},
1010
utils::{get_correct_docsrs_style_file, report_error},
1111
web::{
@@ -201,12 +201,12 @@ impl TryFrom<&str> for ReqVersion {
201201
#[derive(Debug)]
202202
pub(crate) struct MatchedRelease {
203203
/// crate name
204-
pub name: String,
204+
pub name: KrateName,
205205

206206
/// The crate name that was found when attempting to load a crate release.
207207
/// `match_version` will attempt to match a provided crate name against similar crate names with
208208
/// dashes (`-`) replaced with underscores (`_`) and vice versa.
209-
pub corrected_name: Option<String>,
209+
pub corrected_name: Option<KrateName>,
210210

211211
/// what kind of version did we get in the request? ("latest", semver, exact)
212212
pub req_version: ReqVersion,
@@ -344,12 +344,12 @@ async fn match_version(
344344
name: &str,
345345
input_version: &ReqVersion,
346346
) -> Result<MatchedRelease, AxumNope> {
347-
let (crate_id, corrected_name) = {
347+
let (crate_id, name, corrected_name) = {
348348
let row = sqlx::query!(
349349
r#"
350350
SELECT
351351
id as "id: CrateId",
352-
name
352+
name as "name: KrateName"
353353
FROM crates
354354
WHERE normalize_crate_name(name) = normalize_crate_name($1)"#,
355355
name,
@@ -359,10 +359,14 @@ async fn match_version(
359359
.context("error fetching crate")?
360360
.ok_or(AxumNope::CrateNotFound)?;
361361

362+
let name: KrateName = name
363+
.parse()
364+
.expect("here we know it's valid, because we found it after normalizing");
365+
362366
if row.name != name {
363-
(row.id, Some(row.name))
367+
(row.id, name, Some(row.name))
364368
} else {
365-
(row.id, None)
369+
(row.id, name, None)
366370
}
367371
};
368372

@@ -383,7 +387,7 @@ async fn match_version(
383387
.find(|release| &release.version == parsed_req_version)
384388
{
385389
return Ok(MatchedRelease {
386-
name: name.to_owned(),
390+
name,
387391
corrected_name,
388392
req_version: input_version.clone(),
389393
release: release.clone(),
@@ -689,7 +693,7 @@ where
689693
/// MetaData used in header
690694
#[derive(Debug, Clone, PartialEq, Eq, Serialize, bincode::Encode)]
691695
pub(crate) struct MetaData {
692-
pub(crate) name: String,
696+
pub(crate) name: KrateName,
693697
/// The exact version of the release being shown.
694698
pub(crate) version: Version,
695699
/// The version identifier in the request that was used to request this page.
@@ -718,7 +722,7 @@ impl MetaData {
718722
) -> Result<MetaData> {
719723
let row = sqlx::query!(
720724
r#"SELECT
721-
crates.name,
725+
crates.name as "name: KrateName",
722726
releases.version,
723727
releases.description,
724728
releases.target_name,
@@ -1208,7 +1212,7 @@ mod test {
12081212
#[test]
12091213
fn serialize_metadata() {
12101214
let mut metadata = MetaData {
1211-
name: "serde".to_string(),
1215+
name: "serde".parse().unwrap(),
12121216
version: "1.0.0".parse().unwrap(),
12131217
req_version: ReqVersion::Latest,
12141218
description: Some("serde does stuff".to_string()),
@@ -1295,7 +1299,7 @@ mod test {
12951299
assert_eq!(
12961300
metadata.unwrap(),
12971301
MetaData {
1298-
name: "foo".to_string(),
1302+
name: "foo".parse().unwrap(),
12991303
version: "0.1.0".parse().unwrap(),
13001304
req_version: ReqVersion::Latest,
13011305
description: Some("Fake package".to_string()),

0 commit comments

Comments
 (0)