Skip to content

Commit b3a8a68

Browse files
committed
use KrateName NewType in more places, introduce "confirmed name" to params
1 parent 6c7aa13 commit b3a8a68

7 files changed

+63
-31
lines changed

.sqlx/query-f93135119437ea6896864d413e0c6321ba93e043002509290acf736e7210caf2.json renamed to .sqlx/query-05bc6ad8a62d65aeedfff6c4a10a8d09ff86b671b31668bb2571b151206ef7f5.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-c30ed3510f60d2ae638d941aa8e1dee3ceecb713f8bd10869462726443a36ed5.json renamed to .sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-13002f36b4c77ce0055b591051f1f807bdbe47991abab7cd781f5dda5d8b8b56.json renamed to .sqlx/query-d68c28ed8e41b9e3812d15e8447ad2ea418ce40868afa2fc51da3c77a3ca8d9c.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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: 20 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
storage::CompressionAlgorithm,
66
web::{
77
MatchedRelease, MetaData, ReqVersion, error::AxumNope, escaped_uri::EscapedURI,
@@ -50,6 +50,7 @@ pub(crate) struct RustdocParams {
5050

5151
original_uri: Option<EscapedURI>,
5252
name: String,
53+
confirmed_name: Option<KrateName>,
5354
req_version: ReqVersion,
5455
doc_target: Option<String>,
5556
inner_path: Option<String>,
@@ -68,6 +69,7 @@ impl std::fmt::Debug for RustdocParams {
6869
.field("page_kind", &self.page_kind)
6970
.field("original_uri", &self.original_uri)
7071
.field("name", &self.name)
72+
.field("confirmed_name", &self.confirmed_name)
7173
.field("req_version", &self.req_version)
7274
.field("doc_target", &self.doc_target)
7375
.field("inner_path", &self.inner_path)
@@ -166,6 +168,7 @@ impl RustdocParams {
166168
pub(crate) fn new(name: impl Into<String>) -> Self {
167169
Self {
168170
name: name.into().trim().into(),
171+
confirmed_name: None,
169172
req_version: ReqVersion::default(),
170173
original_uri: None,
171174
doc_target: None,
@@ -200,11 +203,12 @@ impl RustdocParams {
200203
}
201204

202205
pub(crate) fn from_metadata(metadata: &MetaData) -> Self {
203-
RustdocParams::new(&metadata.name).apply_metadata(metadata)
206+
RustdocParams::new(metadata.name.to_string()).apply_metadata(metadata)
204207
}
205208

206209
pub(crate) fn apply_metadata(self, metadata: &MetaData) -> RustdocParams {
207-
self.with_name(&metadata.name)
210+
self.with_name(metadata.name.to_string())
211+
.with_confirmed_name(Some(metadata.name.clone()))
208212
.with_req_version(&metadata.req_version)
209213
// first set the doc-target list
210214
.with_maybe_doc_targets(metadata.doc_targets.clone())
@@ -214,12 +218,13 @@ impl RustdocParams {
214218
}
215219

216220
pub(crate) fn from_matched_release(matched_release: &MatchedRelease) -> Self {
217-
RustdocParams::new(&matched_release.name).apply_matched_release(matched_release)
221+
RustdocParams::new(matched_release.name.to_string()).apply_matched_release(matched_release)
218222
}
219223

220224
pub(crate) fn apply_matched_release(self, matched_release: &MatchedRelease) -> RustdocParams {
221225
let release = &matched_release.release;
222-
self.with_name(&matched_release.name)
226+
self.with_name(matched_release.name.to_string())
227+
.with_confirmed_name(Some(matched_release.name.clone()))
223228
.with_req_version(&matched_release.req_version)
224229
.with_maybe_doc_targets(release.doc_targets.as_deref())
225230
.with_maybe_default_target(release.default_target.as_deref())
@@ -236,6 +241,16 @@ impl RustdocParams {
236241
})
237242
}
238243

244+
pub(crate) fn confirmed_name(&self) -> Option<&KrateName> {
245+
self.confirmed_name.as_ref()
246+
}
247+
pub(crate) fn with_confirmed_name(self, confirmed_name: Option<impl Into<KrateName>>) -> Self {
248+
self.update(|mut params| {
249+
params.confirmed_name = confirmed_name.map(Into::into);
250+
params
251+
})
252+
}
253+
239254
pub(crate) fn req_version(&self) -> &ReqVersion {
240255
&self.req_version
241256
}

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)