@@ -105,13 +105,12 @@ impl LanguageServer {
105105 }
106106
107107 fn handle_request ( & self , req : Request ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
108- let req = match cast_r :: < request:: ExecuteCommand > ( req) {
108+ let req = match try_cast_r :: < request:: ExecuteCommand > ( req) ? {
109109 Ok ( ( id, params) ) => {
110110 self . execute_command ( id, & params) ?;
111111 return Ok ( ( ) ) ;
112112 }
113- Err ( err @ ExtractError :: JsonError { .. } ) => panic ! ( "{err:?}" ) ,
114- Err ( ExtractError :: MethodMismatch ( req) ) => req,
113+ Err ( req) => req,
115114 } ;
116115
117116 let _ = req;
@@ -123,43 +122,36 @@ impl LanguageServer {
123122 & self ,
124123 notification : Notification ,
125124 ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
126- let notification = match cast_n :: < notification:: DidOpenTextDocument > ( notification) {
127- Ok ( ( _id , params) ) => {
125+ let notification = match try_cast_n :: < notification:: DidOpenTextDocument > ( notification) ? {
126+ Ok ( params) => {
128127 self . on_change ( & params. text_document . uri , false ) ?;
129128 return Ok ( ( ) ) ;
130129 }
131- Err ( err @ ExtractError :: JsonError { .. } ) => {
132- eprintln ! ( "{err:?}" ) ;
133- return Ok ( ( ) ) ;
134- }
135- Err ( ExtractError :: MethodMismatch ( req) ) => req,
130+ Err ( req) => req,
136131 } ;
137132
138- let notification = match cast_n :: < notification:: DidChangeTextDocument > ( notification) {
139- Ok ( ( _id , params) ) => {
133+ let notification = match try_cast_n :: < notification:: DidChangeTextDocument > ( notification) ? {
134+ Ok ( params) => {
140135 self . on_change ( & params. text_document . uri , false ) ?;
141136 return Ok ( ( ) ) ;
142137 }
143- Err ( err @ ExtractError :: JsonError { .. } ) => panic ! ( "{err:?}" ) ,
144- Err ( ExtractError :: MethodMismatch ( req) ) => req,
138+ Err ( req) => req,
145139 } ;
146140
147- let notification = match cast_n :: < notification:: DidCloseTextDocument > ( notification) {
148- Ok ( ( _id , params) ) => {
141+ let notification = match try_cast_n :: < notification:: DidCloseTextDocument > ( notification) ? {
142+ Ok ( params) => {
149143 self . on_change ( & params. text_document . uri , false ) ?;
150144 return Ok ( ( ) ) ;
151145 }
152- Err ( err @ ExtractError :: JsonError { .. } ) => panic ! ( "{err:?}" ) ,
153- Err ( ExtractError :: MethodMismatch ( req) ) => req,
146+ Err ( req) => req,
154147 } ;
155148
156- let notification = match cast_n :: < notification:: DidSaveTextDocument > ( notification) {
157- Ok ( ( _id , params) ) => {
149+ let notification = match try_cast_n :: < notification:: DidSaveTextDocument > ( notification) ? {
150+ Ok ( params) => {
158151 self . on_change ( & params. text_document . uri , true ) ?;
159152 return Ok ( ( ) ) ;
160153 }
161- Err ( err @ ExtractError :: JsonError { .. } ) => panic ! ( "{err:?}" ) ,
162- Err ( ExtractError :: MethodMismatch ( req) ) => req,
154+ Err ( req) => req,
163155 } ;
164156
165157 let _ = notification;
@@ -256,18 +248,29 @@ impl LanguageServer {
256248 }
257249}
258250
259- fn cast_r < R > ( req : Request ) -> Result < ( RequestId , R :: Params ) , ExtractError < Request > >
251+ // first result if for json decoding error, second is for method mismatch
252+ type CastResult < Payload , Type > = Result < Result < Payload , Type > , ExtractError < Type > > ;
253+
254+ fn try_cast_r < R > ( req : Request ) -> CastResult < ( RequestId , R :: Params ) , Request >
260255where
261256 R : lsp_types:: request:: Request ,
262257 R :: Params : serde:: de:: DeserializeOwned ,
263258{
264- req. extract ( R :: METHOD )
259+ match req. extract ( R :: METHOD ) {
260+ Ok ( params) => Ok ( Ok ( params) ) ,
261+ Err ( ExtractError :: MethodMismatch ( req) ) => Ok ( Err ( req) ) ,
262+ Err ( err) => Err ( err) ,
263+ }
265264}
266265
267- fn cast_n < N > ( req : Notification ) -> Result < ( RequestId , N :: Params ) , ExtractError < Notification > >
266+ fn try_cast_n < N > ( notif : Notification ) -> CastResult < N :: Params , Notification >
268267where
269268 N : lsp_types:: notification:: Notification ,
270269 N :: Params : serde:: de:: DeserializeOwned ,
271270{
272- req. extract ( N :: METHOD )
271+ match notif. extract ( N :: METHOD ) {
272+ Ok ( params) => Ok ( Ok ( params) ) ,
273+ Err ( ExtractError :: MethodMismatch ( notif) ) => Ok ( Err ( notif) ) ,
274+ Err ( err) => Err ( err) ,
275+ }
273276}
0 commit comments