Skip to content

Commit 9157955

Browse files
authored
Merge pull request #9712 from Turbo87/bon
Replace `derive_builder` with `bon`
2 parents 57d8655 + 523aa4d commit 9157955

File tree

10 files changed

+52
-76
lines changed

10 files changed

+52
-76
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ axum = { version = "=0.7.7", features = ["macros", "matched-path"] }
4747
axum-extra = { version = "=0.9.4", features = ["cookie-signed", "typed-header"] }
4848
base64 = "=0.22.1"
4949
bigdecimal = { version = "=0.4.5", features = ["serde"] }
50+
bon = "=2.3.0"
5051
cargo-manifest = "=0.15.2"
5152
crates_io_cdn_logs = { path = "crates/crates_io_cdn_logs" }
5253
crates_io_database = { path = "crates/crates_io_database" }
@@ -62,7 +63,6 @@ chrono = { version = "=0.4.38", default-features = false, features = ["serde"] }
6263
clap = { version = "=4.5.20", features = ["derive", "env", "unicode", "wrap_help"] }
6364
cookie = { version = "=0.18.1", features = ["secure"] }
6465
deadpool-diesel = { version = "=0.6.1", features = ["postgres", "tracing"] }
65-
derive_builder = "=0.20.2"
6666
derive_deref = "=1.1.1"
6767
dialoguer = "=0.11.0"
6868
diesel = { version = "=2.2.4", features = ["postgres", "serde_json", "chrono", "numeric"] }

src/bin/background-worker.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ use crates_io_worker::Runner;
2828
use diesel_async::pooled_connection::deadpool::Pool;
2929
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
3030
use object_store::prefix::PrefixStore;
31-
use object_store::ObjectStore;
3231
use reqwest::Client;
3332
use secrecy::ExposeSecret;
3433
use std::sync::Arc;
@@ -74,7 +73,7 @@ fn main() -> anyhow::Result<()> {
7473
let storage = Arc::new(Storage::from_config(&config.storage));
7574

7675
let downloads_archive_store = PrefixStore::new(storage.as_inner(), "archive/version-downloads");
77-
let downloads_archive_store: Box<dyn ObjectStore> = Box::new(downloads_archive_store);
76+
let downloads_archive_store = Box::new(downloads_archive_store);
7877

7978
let client = Client::builder()
8079
.timeout(Duration::from_secs(45))
@@ -92,14 +91,14 @@ fn main() -> anyhow::Result<()> {
9291
let environment = Environment::builder()
9392
.config(Arc::new(config))
9493
.repository_config(repository_config)
95-
.cloudfront(cloudfront)
96-
.fastly(fastly)
94+
.maybe_cloudfront(cloudfront)
95+
.maybe_fastly(fastly)
9796
.storage(storage)
98-
.downloads_archive_store(Some(downloads_archive_store))
97+
.downloads_archive_store(downloads_archive_store)
9998
.deadpool(deadpool.clone())
10099
.emails(emails)
101100
.team_repo(Box::new(team_repo))
102-
.build()?;
101+
.build();
103102

104103
let environment = Arc::new(environment);
105104

src/controllers/krate/publish.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -360,19 +360,18 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
360360

361361
// Persist the new version of this crate
362362
let version = NewVersion::builder(krate.id, &version_string)
363-
.features(&features)?
364-
.license(license.as_deref())
363+
.features(serde_json::to_value(&features)?)
364+
.maybe_license(license.as_deref())
365365
// Downcast is okay because the file length must be less than the max upload size
366366
// to get here, and max upload sizes are way less than i32 max
367367
.size(content_length as i32)
368368
.published_by(user.id)
369369
.checksum(&hex_cksum)
370-
.links(package.links.as_deref())
371-
.rust_version(rust_version.as_deref())
370+
.maybe_links(package.links.as_deref())
371+
.maybe_rust_version(rust_version.as_deref())
372372
.has_lib(tarball_info.manifest.lib.is_some())
373373
.bin_names(bin_names.as_slice())
374374
.build()
375-
.map_err(|error| internal(error.to_string()))?
376375
.save(conn, &verified_email_address)?;
377376

378377
insert_version_owner_action(

src/models/version.rs

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::collections::BTreeMap;
22

3+
use bon::Builder;
34
use chrono::NaiveDateTime;
45
use crates_io_index::features::FeaturesMap;
5-
use derive_builder::Builder;
66
use diesel::prelude::*;
77
use serde::Deserialize;
88

@@ -80,58 +80,26 @@ impl Version {
8080
#[derive(Insertable, Debug, Builder)]
8181
#[diesel(table_name = versions, check_for_backend(diesel::pg::Pg))]
8282
pub struct NewVersion<'a> {
83+
#[builder(start_fn)]
8384
crate_id: i32,
85+
#[builder(start_fn)]
8486
num: &'a str,
85-
#[builder(default)]
8687
created_at: Option<&'a NaiveDateTime>,
87-
#[builder(default, setter(strip_option))]
8888
yanked: Option<bool>,
89-
#[builder(
90-
default = "serde_json::Value::Object(Default::default())",
91-
setter(custom)
92-
)]
89+
#[builder(default = serde_json::Value::Object(Default::default()))]
9390
features: serde_json::Value,
94-
#[builder(default)]
9591
license: Option<&'a str>,
96-
#[builder(default, setter(name = "size"))]
92+
#[builder(default, name = "size")]
9793
crate_size: i32,
9894
published_by: i32,
9995
checksum: &'a str,
100-
#[builder(default)]
10196
links: Option<&'a str>,
102-
#[builder(default)]
10397
rust_version: Option<&'a str>,
104-
#[builder(default, setter(strip_option))]
10598
pub has_lib: Option<bool>,
106-
#[builder(default, setter(strip_option))]
10799
pub bin_names: Option<&'a [&'a str]>,
108100
}
109101

110-
impl NewVersionBuilder<'_> {
111-
pub fn features(
112-
&mut self,
113-
features: &BTreeMap<String, Vec<String>>,
114-
) -> serde_json::Result<&mut Self> {
115-
self.features = Some(serde_json::to_value(features)?);
116-
Ok(self)
117-
}
118-
119-
/// Set the `checksum` field to a basic dummy value.
120-
pub fn dummy_checksum(&mut self) -> &mut Self {
121-
const DUMMY_CHECKSUM: &str =
122-
"0000000000000000000000000000000000000000000000000000000000000000";
123-
124-
self.checksum(DUMMY_CHECKSUM)
125-
}
126-
}
127-
128102
impl NewVersion<'_> {
129-
pub fn builder(crate_id: i32, version: &str) -> NewVersionBuilder<'_> {
130-
let mut builder = NewVersionBuilder::default();
131-
builder.crate_id(crate_id).num(version);
132-
builder
133-
}
134-
135103
pub fn save(&self, conn: &mut impl Conn, published_by_email: &str) -> AppResult<Version> {
136104
use diesel::dsl::exists;
137105
use diesel::{insert_into, select};

src/tests/builders/version.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::{
55
};
66
use std::collections::BTreeMap;
77

8-
use crate::util::errors::internal;
98
use chrono::NaiveDateTime;
109
use diesel::prelude::*;
1110

@@ -102,17 +101,16 @@ impl VersionBuilder {
102101
let version = self.num.to_string();
103102

104103
let new_version = NewVersion::builder(crate_id, &version)
105-
.features(&self.features)?
106-
.license(self.license.as_deref())
104+
.features(serde_json::to_value(&self.features)?)
105+
.maybe_license(self.license.as_deref())
107106
.size(self.size)
108107
.published_by(published_by)
109108
.checksum(&self.checksum)
110-
.links(self.links.as_deref())
111-
.rust_version(self.rust_version.as_deref())
109+
.maybe_links(self.links.as_deref())
110+
.maybe_rust_version(self.rust_version.as_deref())
112111
.yanked(self.yanked)
113-
.created_at(self.created_at.as_ref())
114-
.build()
115-
.map_err(|error| internal(error.to_string()))?;
112+
.maybe_created_at(self.created_at.as_ref())
113+
.build();
116114

117115
let vers = new_version.save(connection, "[email protected]")?;
118116

src/tests/util/test_app.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,7 @@ impl TestAppBuilder {
306306
.deadpool(app.primary_database.clone())
307307
.emails(app.emails.clone())
308308
.team_repo(Box::new(self.team_repo))
309-
.build()
310-
.unwrap();
309+
.build();
311310

312311
let runner = Runner::new(app.primary_database.clone(), Arc::new(environment))
313312
.shutdown_when_queue_empty()

src/typosquat/test_util.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ pub mod faker {
5353

5454
let version = NewVersion::builder(krate.id, "1.0.0")
5555
.published_by(user.id)
56-
.dummy_checksum()
56+
.checksum("0000000000000000000000000000000000000000000000000000000000000000")
5757
.build()
58-
.unwrap()
5958
.save(conn, "[email protected]")
6059
.unwrap();
6160

src/worker/environment.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::typosquat;
55
use crate::util::diesel::Conn;
66
use crate::Emails;
77
use anyhow::Context;
8+
use bon::Builder;
89
use crates_io_index::{Repository, RepositoryConfig};
910
use crates_io_team_repo::TeamRepo;
10-
use derive_builder::Builder;
1111
use diesel_async::pooled_connection::deadpool::Pool;
1212
use diesel_async::AsyncPgConnection;
1313
use object_store::ObjectStore;
@@ -17,34 +17,26 @@ use std::sync::{Arc, OnceLock};
1717
use std::time::Instant;
1818

1919
#[derive(Builder)]
20-
#[builder(pattern = "owned")]
2120
pub struct Environment {
2221
pub config: Arc<crate::config::Server>,
2322

2423
repository_config: RepositoryConfig,
25-
#[builder(default, setter(skip))]
24+
#[builder(skip)]
2625
repository: Mutex<Option<Repository>>,
27-
#[builder(default)]
2826
cloudfront: Option<CloudFront>,
29-
#[builder(default)]
3027
fastly: Option<Fastly>,
3128
pub storage: Arc<Storage>,
32-
#[builder(default)]
3329
pub downloads_archive_store: Option<Box<dyn ObjectStore>>,
3430
pub deadpool: Pool<AsyncPgConnection>,
3531
pub emails: Emails,
3632
pub team_repo: Box<dyn TeamRepo + Send + Sync>,
3733

3834
/// A lazily initialised cache of the most popular crates ready to use in typosquatting checks.
39-
#[builder(default, setter(skip))]
35+
#[builder(skip)]
4036
typosquat_cache: OnceLock<Result<typosquat::Cache, typosquat::CacheError>>,
4137
}
4238

4339
impl Environment {
44-
pub fn builder() -> EnvironmentBuilder {
45-
EnvironmentBuilder::default()
46-
}
47-
4840
#[instrument(skip_all)]
4941
pub fn lock_index(&self) -> anyhow::Result<RepositoryLock<'_>> {
5042
let mut repo = self.repository.lock();

src/worker/jobs/downloads/update_metadata.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,8 @@ mod tests {
126126

127127
let version = NewVersion::builder(krate.id, "1.0.0")
128128
.published_by(user_id)
129-
.dummy_checksum()
130-
.build()
131-
.unwrap();
129+
.checksum("0000000000000000000000000000000000000000000000000000000000000000")
130+
.build();
132131

133132
let version = version.save(conn, "[email protected]").unwrap();
134133
(krate, version)

0 commit comments

Comments
 (0)