/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" FunctionName ") Ċ Ċ package Ġkotlinx . serialization . schema Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . protobuf . Proto Id Ċ import Ġkotlinx . serialization . protobuf . Proto Number Type Ċ import Ġkotlinx . serialization . protobuf . Proto Type Ġas ĠProtobuf Type Ċ Ċ fun ĠProto Schema ( descriptor : ĠSerial Descriptor ): ĠProtoMessage Ġ{ ĊĠĠĠ Ġval Ġfields Ġ= Ġdescriptor . element Descriptors (). map Indexed Ġ{ Ġindex , Ġchild Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġdescriptor . getElement Annotations ( index ). filter Is Instance < Proto Id >(). single OrNull ()?. id Ġ?: Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġnumber Annotation Ġ= Ġdescriptor . getElement Annotations ( index ). filter Is Instance < Protobuf Type >(). single OrNull ()?. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠProto Number Type . DEFAULT ĊĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . kind Ġis ĠStructure Kind . LIST Ġ-> ĠProto Field Rule . RE PE ATED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . kind Ġis ĠStructure Kind . MAP Ġ-> ĠProto Field Rule . MAP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . is Element Optional ( index ) Ġ-> ĠProto Field Rule . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠProto Field Rule . REQUIRED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdescriptor . getElement Name ( index ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġchild . accept ( Proto Type Inference ( number Annotation )) ĊĠĠĠĠĠĠĠ ĠProto Field ( id , Ġname , Ġrule , Ġtype ) ĊĠĠĠ Ġ}. toList () ĊĠĠĠ Ġreturn ĠProtoMessage ( descriptor . serial Name , Ġfields ) Ċ } ĊĊ Ċ private Ġclass ĠProto Type Inference ( val Ġproto Number Type : ĠProto Number Type ) Ġ: ĠBase Descriptor Visitor < Proto Type >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit String ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ= ĠLength Delimited . string ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Primitive ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ= Ġwhen Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPrimitive Kind . BYTE , ĠPrimitive Kind . SHORT , ĠPrimitive Kind . INT , ĠPrimitive Kind . CHAR Ġ-> Ġwhen Ġ( proto Number Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . DEFAULT Ġ-> ĠVar int Type . int 3 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . SIGNED Ġ-> ĠVar int Type . sint 3 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . FIXED Ġ-> ĠFixed 3 2 Bit Type . fixed 3 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPrimitive Kind . LONG Ġ-> Ġwhen Ġ( proto Number Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . DEFAULT Ġ-> ĠVar int Type . int 6 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . SIGNED Ġ-> ĠVar int Type . sint 6 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProto Number Type . FIXED Ġ-> ĠFixed 6 4 Bit Type . fixed 6 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPrimitive Kind . BOOLEAN Ġ-> ĠVar int Type . bool ĊĠĠĠĠĠĠĠ Ġis ĠPrimitive Kind . FLOAT Ġ-> ĠFixed 3 2 Bit Type . float ĊĠĠĠĠĠĠĠ Ġis ĠPrimitive Kind . DOUBLE Ġ-> ĠFixed 6 4 Bit Type . double ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProto Schema ( descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Collection ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStructure Kind . LIST Ġ-> Ġvisit Descriptor ( descriptor . getElement Descriptor ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStructure Kind . MAP Ġ-> ĠProto Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Descriptor ( descriptor . getElement Descriptor ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Descriptor ( descriptor . getElement Descriptor ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Enum ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠVar int Type . enum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Union ( descriptor : ĠSerial Descriptor ): ĠProto Type Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Un ions Ġare Ġnot Ġsupported Ġin Ġprotobuf ") ĊĠĠĠ Ġ} Ċ } Ċ