@@ -7,7 +7,8 @@ use serde_json::json;
77use serde_json:: Value ;
88
99use crate :: json_schema:: types;
10- use crate :: { Error , Result } ;
10+ use crate :: Error ;
11+ use crate :: Result ;
1112
1213pub ( crate ) struct Parser < ' a > {
1314 root : & ' a Value ,
@@ -305,9 +306,39 @@ impl<'a> Parser<'a> {
305306 }
306307
307308 fn parse_type ( & mut self , obj : & serde_json:: Map < String , Value > ) -> Result < String > {
308- let instance_type = obj[ "type" ]
309- . as_str ( )
310- . ok_or_else ( || Error :: TypeMustBeAString ) ?;
309+ match obj. get ( "type" ) {
310+ Some ( Value :: String ( instance_type) ) => self . parse_type_string ( instance_type, obj) ,
311+ Some ( Value :: Array ( instance_types) ) => self . parse_type_array ( instance_types, obj) ,
312+ _ => Err ( Error :: TypeMustBeAStringOrArray ) ,
313+ }
314+ }
315+
316+ fn parse_type_array (
317+ & mut self ,
318+ instance_types : & [ serde_json:: Value ] ,
319+ obj : & serde_json:: Map < String , Value > ,
320+ ) -> Result < String > {
321+ let xor_patterns = instance_types
322+ . iter ( )
323+ . map ( |instance_type| match instance_type. as_str ( ) {
324+ Some ( instance_type) => {
325+ let sub_regex = self . parse_type_string ( instance_type, obj) ?;
326+
327+ Ok ( format ! ( r"(?:{})" , sub_regex) )
328+ }
329+ None => Err ( Error :: TypeMustBeAStringOrArray ) ,
330+ } )
331+ . collect :: < Result < Vec < String > > > ( ) ?
332+ . join ( "|" ) ;
333+
334+ Ok ( format ! ( r"({})" , xor_patterns) )
335+ }
336+
337+ fn parse_type_string (
338+ & mut self ,
339+ instance_type : & str ,
340+ obj : & serde_json:: Map < String , Value > ,
341+ ) -> Result < String > {
311342 match instance_type {
312343 "string" => self . parse_string_type ( obj) ,
313344 "number" => self . parse_number_type ( obj) ,
0 commit comments