@@ -227,21 +227,25 @@ pub type InstantiatedFilterType =
227227pub enum SingleOrMany < A : Info < Supported = All > , M : Info < Supported = Language > > {
228228 All ( A ) ,
229229 Many ( Many < M > ) ,
230+ Single ( M ) ,
230231}
231232impl < A : Info < Supported = All > , M : Info < Supported = Language > > SingleOrMany < A , M > {
232233 #[ must_use]
233234 pub fn filter_name ( & self ) -> String {
234235 match self {
235236 Self :: All ( f) => f. filter_name ( ) ,
236237 Self :: Many ( many) => many. name . clone ( ) ,
238+ Self :: Single ( s) => s. filter_name ( ) ,
237239 }
238240 }
239241
240242 #[ must_use]
241243 pub fn supports ( & self ) -> SupportedLanguages {
242244 match self {
245+ // Self::Single(s) => SupportedLanguages::Single(s.)
243246 Self :: All ( _) => SupportedLanguages :: All ,
244247 Self :: Many ( many) => SupportedLanguages :: Many ( many. filters . keys ( ) . cloned ( ) . collect ( ) ) ,
248+ SingleOrMany :: Single ( _) => todo ! ( ) ,
245249 }
246250 }
247251}
@@ -251,9 +255,17 @@ impl<A: Info<Supported = All>, M: Info<Supported = Language>> Display for Single
251255 }
252256}
253257impl < ' a > FilterType < ' a > {
258+ pub fn specific ( & self , s : & str ) -> Option < Self > {
259+ match self {
260+ Self :: All ( _) | Self :: Single ( _) => None ,
261+ Self :: Many ( m) => m. filters . get ( s) . map ( |x| Self :: Single ( * x) ) ,
262+ }
263+ }
264+
254265 pub fn to_filter ( & self , s : & str ) -> Result < InstantiatedFilterType , String > {
255266 match self {
256267 SingleOrMany :: All ( a) => a. to_filter ( s) . map ( SingleOrMany :: All ) ,
268+ SingleOrMany :: Single ( a) => a. to_filter ( s) . map ( SingleOrMany :: Single ) ,
257269 SingleOrMany :: Many ( Many { name, filters } ) => filters
258270 . iter ( )
259271 . map ( |( name, f) | f. to_filter ( s) . map ( |f| ( name. clone ( ) , f) ) )
@@ -345,6 +357,13 @@ impl<'a> Filters<'a> {
345357 match filters {
346358 SingleOrMany :: All ( _) => Err ( "cannot add to an all filter" . to_string ( ) ) ,
347359 SingleOrMany :: Many ( Many { filters, .. } ) => merge_filters ( filters, filter) ,
360+ SingleOrMany :: Single ( s) => {
361+ * filters = SingleOrMany :: Many ( Many {
362+ name : "" . to_string ( ) ,
363+ filters : HashMap :: from ( [ ( s. filter_name ( ) , * s) ] ) ,
364+ } ) ;
365+ Ok ( ( ) )
366+ }
348367 }
349368 } else {
350369 self . filters . insert ( name, filter) ;
0 commit comments