Skip to content

Commit b2ef65d

Browse files
committed
Extract split_features() fn
1 parent 2e5a4fe commit b2ef65d

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

src/models.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ mod default_versions;
2424
pub mod dependency;
2525
mod download;
2626
mod email;
27+
pub mod feature;
2728
mod follow;
2829
mod keyword;
2930
pub mod krate;

src/models/feature.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use std::collections::BTreeMap;
2+
3+
pub type FeaturesMap = BTreeMap<String, Vec<String>>;
4+
5+
/// Splits the given [`FeaturesMap`] into two [`FeaturesMap`]s based on their
6+
/// values.
7+
///
8+
/// See <https://rust-lang.github.io/rfcs/3143-cargo-weak-namespaced-features.html>.
9+
pub fn split_features(features: FeaturesMap) -> (FeaturesMap, FeaturesMap) {
10+
features.into_iter().partition(|(_k, vals)| {
11+
!vals
12+
.iter()
13+
.any(|v| v.starts_with("dep:") || v.contains("?/"))
14+
})
15+
}

src/models/krate.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::collections::BTreeMap;
2-
31
use chrono::NaiveDateTime;
42
use diesel::associations::Identifiable;
53
use diesel::dsl;
@@ -10,6 +8,7 @@ use secrecy::SecretString;
108
use thiserror::Error;
119

1210
use crate::controllers::helpers::pagination::*;
11+
use crate::models::feature::split_features;
1312
use crate::models::helpers::with_count::*;
1413
use crate::models::version::TopVersions;
1514
use crate::models::{
@@ -484,12 +483,7 @@ impl Crate {
484483
deps.sort();
485484

486485
let features = version.features().unwrap_or_default();
487-
let (features, features2): (BTreeMap<_, _>, BTreeMap<_, _>) =
488-
features.into_iter().partition(|(_k, vals)| {
489-
!vals
490-
.iter()
491-
.any(|v| v.starts_with("dep:") || v.contains("?/"))
492-
});
486+
let (features, features2) = split_features(features);
493487

494488
let (features2, v) = if features2.is_empty() {
495489
(None, None)

src/models/version.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use serde::Deserialize;
77

88
use crate::util::errors::{bad_request, AppResult};
99

10+
use crate::models::feature::FeaturesMap;
1011
use crate::models::{Crate, Dependency, User};
1112
use crate::schema::*;
1213
use crate::sql::split_part;
@@ -71,7 +72,7 @@ impl Version {
7172
///
7273
/// * `Ok(BTreeMap<String, Vec<String>>)` - If the deserialization was successful.
7374
/// * `Err(serde_json::Error)` - If the deserialization failed.
74-
pub fn features(&self) -> Result<BTreeMap<String, Vec<String>>, serde_json::Error> {
75+
pub fn features(&self) -> Result<FeaturesMap, serde_json::Error> {
7576
BTreeMap::<String, Vec<String>>::deserialize(&self.features)
7677
}
7778
}

0 commit comments

Comments
 (0)