Skip to content

Commit bba0a55

Browse files
committed
sketch up SubFeature enum
1 parent 55365ba commit bba0a55

File tree

1 file changed

+40
-26
lines changed

1 file changed

+40
-26
lines changed

src/web/features.rs

+40-26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
db::types::Feature,
2+
db::types::Feature as DbFeature,
33
impl_axum_webpage,
44
web::{
55
cache::CachePolicy,
@@ -17,13 +17,27 @@ use std::collections::{HashMap, VecDeque};
1717
const DEFAULT_NAME: &str = "default";
1818

1919
#[derive(Debug, Clone, Serialize)]
20-
struct DocsFeature {
20+
struct Feature {
2121
name: String,
2222
subfeatures: Vec<String>,
2323
is_default: bool,
2424
}
2525

26-
type AllFeatures = HashMap<String, DocsFeature>;
26+
/// The sub-feature enabled by a [`Feature`]
27+
enum SubFeature {
28+
/// A normal feature, like `"feature-name"`.
29+
Feature(String),
30+
/// A dependency, like `"dep:package-name"`.
31+
Dependency(String),
32+
/// A dependency feature, like `"package-name?/feature-name"`.
33+
DependencyFeature {
34+
dependency: String,
35+
optional: bool,
36+
feature: String,
37+
},
38+
}
39+
40+
type AllFeatures = HashMap<String, Feature>;
2741

2842
#[derive(Debug, Clone, Serialize)]
2943
struct FeaturesPage {
@@ -65,7 +79,7 @@ pub(crate) async fn build_features_handler(
6579

6680
let row = sqlx::query!(
6781
r#"
68-
SELECT releases.features as "features?: Vec<Feature>"
82+
SELECT releases.features as "features?: Vec<DbFeature>"
6983
FROM releases
7084
INNER JOIN crates ON crates.id = releases.crate_id
7185
WHERE crates.name = $1 AND releases.version = $2"#,
@@ -99,7 +113,7 @@ pub(crate) async fn build_features_handler(
99113
.into_response())
100114
}
101115

102-
fn order_features_and_count_default_len(raw: Vec<Feature>) -> (AllFeatures, Vec<String>, usize) {
116+
fn order_features_and_count_default_len(raw: Vec<DbFeature>) -> (AllFeatures, Vec<String>, usize) {
103117
let mut all_features = get_all_features(raw);
104118
let sorted_features = get_sorted_features(&mut all_features);
105119

@@ -115,7 +129,7 @@ fn order_features_and_count_default_len(raw: Vec<Feature>) -> (AllFeatures, Vec<
115129
/// and alphabetically otherwise.
116130
fn get_sorted_features(all_features: &mut AllFeatures) -> Vec<String> {
117131
let mut sorted_features = Vec::new();
118-
let mut working_features: HashMap<&str, &mut DocsFeature> = all_features
132+
let mut working_features: HashMap<&str, &mut Feature> = all_features
119133
.iter_mut()
120134
.map(|(k, v)| (k.as_str(), v))
121135
.collect();
@@ -143,14 +157,14 @@ fn get_sorted_features(all_features: &mut AllFeatures) -> Vec<String> {
143157
sorted_features
144158
}
145159

146-
/// Parses the raw [`Feature`] into a map of the more structured [`DocsFeature`].
147-
fn get_all_features(raw: Vec<Feature>) -> AllFeatures {
160+
/// Parses the raw [`DbFeature`] into a map of the more structured [`DocsFeature`].
161+
fn get_all_features(raw: Vec<DbFeature>) -> AllFeatures {
148162
raw.into_iter()
149163
.filter(|feature| !feature.is_private())
150164
.map(|feature| {
151165
(
152166
feature.name.clone(),
153-
DocsFeature {
167+
Feature {
154168
name: feature.name,
155169
subfeatures: feature.subfeatures,
156170
is_default: false,
@@ -168,8 +182,8 @@ mod tests {
168182

169183
#[test]
170184
fn test_feature_map_filters_private() {
171-
let private1 = Feature::new("_private1".into(), vec!["feature1".into()]);
172-
let feature2 = Feature::new("feature2".into(), Vec::new());
185+
let private1 = DbFeature::new("_private1".into(), vec!["feature1".into()]);
186+
let feature2 = DbFeature::new("feature2".into(), Vec::new());
173187

174188
let raw = vec![private1.clone(), feature2.clone()];
175189
let all_features = get_all_features(raw);
@@ -181,14 +195,14 @@ mod tests {
181195

182196
#[test]
183197
fn test_default_tree_structure_with_nested_default() {
184-
let default = Feature::new(DEFAULT_NAME.into(), vec!["feature1".into()]);
185-
let non_default = Feature::new("non-default".into(), Vec::new());
186-
let feature1 = Feature::new(
198+
let default = DbFeature::new(DEFAULT_NAME.into(), vec!["feature1".into()]);
199+
let non_default = DbFeature::new("non-default".into(), Vec::new());
200+
let feature1 = DbFeature::new(
187201
"feature1".into(),
188202
vec!["feature2".into(), "feature3".into()],
189203
);
190-
let feature2 = Feature::new("feature2".into(), Vec::new());
191-
let feature3 = Feature::new("feature3".into(), Vec::new());
204+
let feature2 = DbFeature::new("feature2".into(), Vec::new());
205+
let feature3 = DbFeature::new("feature3".into(), Vec::new());
192206

193207
let raw = vec![
194208
default.clone(),
@@ -218,12 +232,12 @@ mod tests {
218232

219233
#[test]
220234
fn test_default_tree_structure_without_default() {
221-
let feature1 = Feature::new(
235+
let feature1 = DbFeature::new(
222236
"feature1".into(),
223237
vec!["feature2".into(), "feature3".into()],
224238
);
225-
let feature2 = Feature::new("feature2".into(), Vec::new());
226-
let feature3 = Feature::new("feature3".into(), Vec::new());
239+
let feature2 = DbFeature::new("feature2".into(), Vec::new());
240+
let feature3 = DbFeature::new("feature3".into(), Vec::new());
227241

228242
let raw = vec![feature3.clone(), feature2.clone(), feature1.clone()];
229243
let mut all_features = get_all_features(raw);
@@ -240,8 +254,8 @@ mod tests {
240254

241255
#[test]
242256
fn test_default_tree_structure_single_default() {
243-
let default = Feature::new(DEFAULT_NAME.into(), Vec::new());
244-
let non_default = Feature::new("non-default".into(), Vec::new());
257+
let default = DbFeature::new(DEFAULT_NAME.into(), Vec::new());
258+
let non_default = DbFeature::new("non-default".into(), Vec::new());
245259

246260
let raw = vec![default.clone(), non_default.clone()];
247261
let mut all_features = get_all_features(raw);
@@ -257,12 +271,12 @@ mod tests {
257271

258272
#[test]
259273
fn test_order_features_and_get_len_without_default() {
260-
let feature1 = Feature::new(
274+
let feature1 = DbFeature::new(
261275
"feature1".into(),
262276
vec!["feature10".into(), "feature11".into()],
263277
);
264-
let feature2 = Feature::new("feature2".into(), vec!["feature20".into()]);
265-
let feature3 = Feature::new("feature3".into(), Vec::new());
278+
let feature2 = DbFeature::new("feature2".into(), vec!["feature20".into()]);
279+
let feature3 = DbFeature::new("feature3".into(), Vec::new());
266280

267281
let raw = vec![feature3.clone(), feature2.clone(), feature1.clone()];
268282
let (_all_features, sorted_features, default_len) =
@@ -277,8 +291,8 @@ mod tests {
277291

278292
#[test]
279293
fn test_order_features_and_get_len_single_default() {
280-
let default = Feature::new(DEFAULT_NAME.into(), Vec::new());
281-
let non_default = Feature::new("non-default".into(), Vec::new());
294+
let default = DbFeature::new(DEFAULT_NAME.into(), Vec::new());
295+
let non_default = DbFeature::new("non-default".into(), Vec::new());
282296

283297
let raw = vec![default.clone(), non_default.clone()];
284298
let (_all_features, sorted_features, default_len) =

0 commit comments

Comments
 (0)