@@ -17,38 +17,31 @@ pub enum BindingFilterTokenPayloadInner {
1717}
1818
1919impl BindingFilterTokenPayloadInner {
20- pub fn expect_string ( self ) -> String {
20+ pub fn try_into_string ( self ) -> anyhow :: Result < String > {
2121 match self {
22- BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => inner. expect_string ( ) ,
23- BindingFilterTokenPayloadInner :: Number ( _) | BindingFilterTokenPayloadInner :: Boolean ( _) => {
24- unreachable ! ( )
25- }
22+ BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => inner. try_into_string ( ) ,
23+ other => anyhow:: bail!( "expected a string payload, but got {other:?}" ) ,
2624 }
2725 }
2826
29- pub fn expect_string_or_regex ( self ) -> StringOrRegex {
27+ pub fn try_into_string_or_regex ( self ) -> anyhow :: Result < StringOrRegex > {
3028 match self {
31- BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => inner,
32- BindingFilterTokenPayloadInner :: Number ( _) | BindingFilterTokenPayloadInner :: Boolean ( _) => {
33- unreachable ! ( )
34- }
29+ BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => Ok ( inner) ,
30+ other => anyhow:: bail!( "expected a string or regex payload, but got {other:?}" ) ,
3531 }
3632 }
3733
38- pub fn expect_number ( self ) -> u32 {
34+ pub fn try_into_number ( self ) -> anyhow :: Result < u32 > {
3935 match self {
40- BindingFilterTokenPayloadInner :: Number ( v) => v,
41- BindingFilterTokenPayloadInner :: StringOrRegex ( _)
42- | BindingFilterTokenPayloadInner :: Boolean ( _) => unreachable ! ( ) ,
36+ BindingFilterTokenPayloadInner :: Number ( v) => Ok ( v) ,
37+ other => anyhow:: bail!( "expected a number payload, but got {other:?}" ) ,
4338 }
4439 }
4540
46- pub fn expect_regex ( self ) -> HybridRegex {
41+ pub fn try_into_regex ( self ) -> anyhow :: Result < HybridRegex > {
4742 match self {
48- BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => inner. expect_regex ( ) ,
49- BindingFilterTokenPayloadInner :: Number ( _) | BindingFilterTokenPayloadInner :: Boolean ( _) => {
50- unreachable ! ( )
51- }
43+ BindingFilterTokenPayloadInner :: StringOrRegex ( inner) => inner. try_into_regex ( ) ,
44+ other => anyhow:: bail!( "expected a regex payload, but got {other:?}" ) ,
5245 }
5346 }
5447}
@@ -107,64 +100,42 @@ pub enum FilterTokenKind {
107100 QueryValue ,
108101}
109102
110- pub fn normalized_tokens ( tokens : Vec < BindingFilterToken > ) -> Vec < Token > {
103+ pub fn normalized_tokens ( tokens : Vec < BindingFilterToken > ) -> anyhow:: Result < Vec < Token > > {
104+ fn take_payload (
105+ token : & mut BindingFilterToken ,
106+ ) -> anyhow:: Result < BindingFilterTokenPayloadInner > {
107+ token
108+ . payload
109+ . take ( )
110+ . ok_or_else ( || anyhow:: anyhow!( "`{:?}` token should have a payload" , token. kind) )
111+ . map ( BindingFilterTokenPayload :: into_inner)
112+ }
113+
111114 let mut ret: Vec < Token > = Vec :: with_capacity ( tokens. len ( ) ) ;
112115 let mut iter = tokens. into_iter ( ) . peekable ( ) ;
113116 while let Some ( value) = iter. peek_mut ( ) {
114117 match value. kind {
115118 FilterTokenKind :: Id => {
116- ret. push ( Token :: from (
117- value
118- . payload
119- . take ( )
120- . expect ( "`Id` should have payload" )
121- . into_inner ( )
122- . expect_string_or_regex ( ) ,
123- ) ) ;
119+ ret. push ( Token :: from ( take_payload ( value) ?. try_into_string_or_regex ( ) ?) ) ;
124120 ret. push ( Token :: Id ) ;
125121 }
126122 FilterTokenKind :: ImporterId => {
127- ret. push ( Token :: from (
128- value
129- . payload
130- . take ( )
131- . expect ( "`ImporterId` should have payload" )
132- . into_inner ( )
133- . expect_string_or_regex ( ) ,
134- ) ) ;
123+ ret. push ( Token :: from ( take_payload ( value) ?. try_into_string_or_regex ( ) ?) ) ;
135124 ret. push ( Token :: ImporterId ) ;
136125 }
137126 FilterTokenKind :: Code => {
138- ret. push ( Token :: from (
139- value
140- . payload
141- . take ( )
142- . expect ( "`Code` should have payload" )
143- . into_inner ( )
144- . expect_string_or_regex ( ) ,
145- ) ) ;
127+ ret. push ( Token :: from ( take_payload ( value) ?. try_into_string_or_regex ( ) ?) ) ;
146128 ret. push ( Token :: Code ) ;
147129 }
148130 FilterTokenKind :: ModuleType => {
149- ret. push ( Token :: String (
150- value
151- . payload
152- . take ( )
153- . expect ( "`ModuleType` should have payload" )
154- . into_inner ( )
155- . expect_string ( ) ,
156- ) ) ;
131+ ret. push ( Token :: String ( take_payload ( value) ?. try_into_string ( ) ?) ) ;
157132 ret. push ( Token :: ModuleType ) ;
158133 }
159134 FilterTokenKind :: And => {
160- ret. push ( Token :: And (
161- value. payload . take ( ) . expect ( "And should have payload" ) . into_inner ( ) . expect_number ( ) ,
162- ) ) ;
135+ ret. push ( Token :: And ( take_payload ( value) ?. try_into_number ( ) ?) ) ;
163136 }
164137 FilterTokenKind :: Or => {
165- ret. push ( Token :: Or (
166- value. payload . take ( ) . expect ( "`Or` should have payload" ) . into_inner ( ) . expect_number ( ) ,
167- ) ) ;
138+ ret. push ( Token :: Or ( take_payload ( value) ?. try_into_number ( ) ?) ) ;
168139 }
169140 FilterTokenKind :: Not => {
170141 ret. push ( Token :: Not ) ;
@@ -173,40 +144,38 @@ pub fn normalized_tokens(tokens: Vec<BindingFilterToken>) -> Vec<Token> {
173144 FilterTokenKind :: Exclude => ret. push ( Token :: Exclude ) ,
174145 FilterTokenKind :: CleanUrl => ret. push ( Token :: CleanUrl ) ,
175146 FilterTokenKind :: QueryKey => {
176- let query_key = value
177- . payload
178- . take ( )
179- . expect ( "`QueryKey` should have payload" )
180- . into_inner ( )
181- . expect_string ( ) ;
147+ let query_key = take_payload ( value) ?. try_into_string ( ) ?;
182148 iter. next ( ) ;
183- let Some ( next_token) = iter. peek_mut ( ) else {
184- unreachable ! ( "`QueryKey` should be followed by one Token" ) ;
185- } ;
149+ let next_token = iter. peek_mut ( ) . ok_or_else ( || {
150+ anyhow :: anyhow !( "`QueryKey` should be followed by a `QueryValue` token" )
151+ } ) ? ;
186152 if next_token. kind != FilterTokenKind :: QueryValue {
187- unreachable ! ( "`QueryKey` should be followed by `QueryValue`" ) ;
153+ anyhow:: bail!(
154+ "`QueryKey` should be followed by `QueryValue`, but got `{:?}`" ,
155+ next_token. kind
156+ ) ;
188157 }
189- let query_value =
190- match next_token . payload . take ( ) . expect ( "`QueryValue` should have payload" ) . into_inner ( ) {
191- BindingFilterTokenPayloadInner :: StringOrRegex ( string_or_regex ) => match string_or_regex
192- {
193- StringOrRegex :: String ( str ) => Token :: String ( str ) ,
194- StringOrRegex :: Regex ( regexp ) => Token :: Regex ( regexp ) ,
195- } ,
196- BindingFilterTokenPayloadInner :: Boolean ( v ) => Token :: Boolean ( v ) ,
197- BindingFilterTokenPayloadInner :: Number ( _ ) => todo ! ( ) ,
198- } ;
158+ let query_value = match take_payload ( next_token ) ? {
159+ BindingFilterTokenPayloadInner :: StringOrRegex ( string_or_regex ) => match string_or_regex {
160+ StringOrRegex :: String ( str ) => Token :: String ( str ) ,
161+ StringOrRegex :: Regex ( regexp ) => Token :: Regex ( regexp ) ,
162+ } ,
163+ BindingFilterTokenPayloadInner :: Boolean ( v ) => Token :: Boolean ( v ) ,
164+ BindingFilterTokenPayloadInner :: Number ( _ ) => {
165+ anyhow :: bail! ( "number values are not supported for query filter values" ) ;
166+ }
167+ } ;
199168 ret. push ( query_value) ;
200169 ret. push ( Token :: String ( query_key) ) ;
201170 ret. push ( Token :: Query ) ;
202171 iter. next ( ) ;
203172 continue ;
204173 }
205174 FilterTokenKind :: QueryValue => {
206- unreachable ! ( "`QueryValue` is not expected " ) ;
175+ anyhow :: bail !( "`QueryValue` token should not appear without a preceding `QueryKey` " ) ;
207176 }
208177 }
209178 iter. next ( ) ;
210179 }
211- ret
180+ Ok ( ret)
212181}
0 commit comments