@@ -88,6 +88,7 @@ mod tokenizer;
88
88
mod material;
89
89
mod model;
90
90
91
+ use std:: borrow:: Cow ;
91
92
use std:: result:: Result ;
92
93
93
94
pub use model:: {
@@ -121,8 +122,8 @@ pub enum ObjError {
121
122
MaterialParse ( #[ from] MaterialError ) ,
122
123
123
124
/// An unexpected token was encountered in the token stream.
124
- #[ error( "Unexpected token encountered: `{0:#? }`" ) ]
125
- UnexpectedToken ( Token ) ,
125
+ #[ error( "Unexpected token encountered: `{0}`" ) ]
126
+ UnexpectedToken ( String ) ,
126
127
127
128
/// The specification for obj/mtl files has some settings
128
129
/// either being "on" or "off". If there is an issue
@@ -141,7 +142,7 @@ pub enum ObjError {
141
142
/// or a constructed `Model`.
142
143
pub fn load_obj ( input : & str ) -> Result < Model , ObjError > {
143
144
match tokenizer:: parse_obj ( input) {
144
- Ok ( tokens) => Ok ( model:: parse ( & tokens) ?) ,
145
+ Ok ( tokens) => Ok ( model:: parse ( tokens) ?) ,
145
146
Err ( e) => Err ( e. into ( ) ) ,
146
147
}
147
148
}
@@ -156,7 +157,7 @@ pub fn load_obj(input: &str) -> Result<Model, ObjError> {
156
157
/// or a collection of `Material`.
157
158
pub fn load_mtl ( input : & str ) -> Result < Vec < Material > , ObjError > {
158
159
match tokenizer:: parse_mtl ( input) {
159
- Ok ( tokens) => Ok ( material:: parse ( & tokens) ?) ,
160
+ Ok ( tokens) => Ok ( material:: parse ( tokens) ?) ,
160
161
Err ( e) => Err ( e. into ( ) ) ,
161
162
}
162
163
}
@@ -167,7 +168,7 @@ fn get_token_float(token: &Token) -> Result<f32, ObjError> {
167
168
} else if let Token :: Int ( i) = token {
168
169
Ok ( * i as f32 )
169
170
} else {
170
- Err ( ObjError :: UnexpectedToken ( token . clone ( ) ) )
171
+ Err ( ObjError :: UnexpectedToken ( format ! ( "{:#?}" , token ) ) )
171
172
}
172
173
}
173
174
@@ -178,7 +179,7 @@ fn get_opt_token_float_opt(token: &Option<Token>) -> Result<Option<f32>, ObjErro
178
179
} else if let Token :: Int ( i) = t {
179
180
Ok ( Some ( * i as f32 ) )
180
181
} else {
181
- Err ( ObjError :: UnexpectedToken ( t . clone ( ) ) )
182
+ Err ( ObjError :: UnexpectedToken ( format ! ( "{:#?}" , token ) ) )
182
183
}
183
184
} else {
184
185
Ok ( None )
@@ -189,27 +190,29 @@ fn get_token_int(token: &Token) -> Result<i32, ObjError> {
189
190
if let Token :: Int ( i) = token {
190
191
Ok ( * i)
191
192
} else {
192
- Err ( ObjError :: UnexpectedToken ( token . clone ( ) ) )
193
+ Err ( ObjError :: UnexpectedToken ( format ! ( "{:#?}" , token ) ) )
193
194
}
194
195
}
195
196
196
- fn get_token_string ( token : & Token ) -> Result < String , ObjError > {
197
+ fn get_token_string < ' a > ( token : & ' a Token ) -> Result < Cow < ' a , str > , ObjError > {
197
198
if let Token :: String ( s) = token {
198
199
Ok ( s. clone ( ) )
199
200
} else if let Token :: Int ( i) = token {
200
- Ok ( i. to_string ( ) )
201
+ Ok ( Cow :: Owned ( i. to_string ( ) ) )
201
202
} else if let Token :: Float ( f) = token {
202
- Ok ( f. to_string ( ) )
203
+ Ok ( Cow :: Owned ( f. to_string ( ) ) )
203
204
} else {
204
- Err ( ObjError :: UnexpectedToken ( token . clone ( ) ) )
205
+ Err ( ObjError :: UnexpectedToken ( format ! ( "{:#?}" , token ) ) )
205
206
}
206
207
}
207
208
208
209
fn get_on_off_from_str ( token : & Token ) -> Result < bool , ObjError > {
209
- let s = get_token_string ( & token) ?;
210
- match s. as_str ( ) {
211
- "on" => Ok ( true ) ,
212
- "off" => Ok ( false ) ,
213
- _ => Err ( ObjError :: InvalidOnOffValue ( s. clone ( ) ) ) ,
210
+ let s = get_token_string ( token) ?;
211
+ if s. eq_ignore_ascii_case ( "on" ) {
212
+ Ok ( true )
213
+ } else if s. eq_ignore_ascii_case ( "off" ) {
214
+ Ok ( false )
215
+ } else {
216
+ Err ( ObjError :: UnexpectedToken ( format ! ( "{:#?}" , token) ) )
214
217
}
215
218
}
0 commit comments