11use 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};
1717const 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 ) ]
2943struct 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.
116130fn 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