@@ -610,17 +610,31 @@ pub struct Suggestion {
610610}
611611
612612#[ derive( Eq , PartialEq , Clone , Debug , Serialize , Deserialize ) ]
613+ #[ repr( u8 ) ]
613614pub enum MessageType {
614615 Error = 0 ,
615616 Diagnostic = 1 ,
616617}
617618
618- impl MessageType {
619- pub fn from_u8 ( value : u8 ) -> Option < Self > {
619+ #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
620+ pub struct InvalidMessageType ( pub u8 ) ;
621+
622+ impl std:: fmt:: Display for InvalidMessageType {
623+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
624+ write ! ( f, "invalid message type: {}" , self . 0 )
625+ }
626+ }
627+
628+ impl std:: error:: Error for InvalidMessageType { }
629+
630+ impl TryFrom < u8 > for MessageType {
631+ type Error = InvalidMessageType ;
632+
633+ fn try_from ( value : u8 ) -> Result < Self , InvalidMessageType > {
620634 match value {
621- 0 => Some ( MessageType :: Error ) ,
622- 1 => Some ( MessageType :: Diagnostic ) ,
623- _ => None ,
635+ 0 => Ok ( Self :: Error ) ,
636+ 1 => Ok ( Self :: Diagnostic ) ,
637+ _ => Err ( InvalidMessageType ( value ) ) ,
624638 }
625639 }
626640}
@@ -693,8 +707,8 @@ fn parse_single_message(cursor: &mut std::io::Cursor<&[u8]>) -> Result<TsGoLintM
693707 if cursor. read_exact ( & mut message_type_byte) . is_err ( ) {
694708 return Err ( "Failed to read message type byte" . to_string ( ) ) ;
695709 }
696- let message_type = MessageType :: from_u8 ( message_type_byte[ 0 ] )
697- . ok_or_else ( | | "Invalid message type byte" . to_string ( ) ) ?;
710+ let message_type = MessageType :: try_from ( message_type_byte[ 0 ] )
711+ . map_err ( |_ | "Invalid message type byte" . to_string ( ) ) ?;
698712
699713 let mut payload_bytes = vec ! [ 0u8 ; size] ;
700714 if cursor. read_exact ( & mut payload_bytes) . is_err ( ) {
0 commit comments