@@ -19,72 +19,77 @@ module JsonRpcServer =
1919 type RequestHandler = JsonRpcRequest -> Task< JsonRpcResponse>
2020 type NotificationHandler = JsonRpcNotification -> Task< unit>
2121
22- let private jsonSettings =
22+ let private jsonSettings =
2323 JsonSerializerSettings(
2424 NullValueHandling = NullValueHandling.Ignore,
25- DefaultValueHandling = DefaultValueHandling.Ignore)
25+ DefaultValueHandling = DefaultValueHandling.Ignore
26+ )
2627
27- let private serialize obj =
28- JsonConvert.SerializeObject( obj, jsonSettings)
28+ let private serialize obj = JsonConvert.SerializeObject( obj, jsonSettings)
2929
30- let private deserialize < 'T > ( json : string ) =
31- JsonConvert.DeserializeObject< 'T>( json, jsonSettings)
30+ let private deserialize < 'T > ( json : string ) = JsonConvert.DeserializeObject< 'T>( json, jsonSettings)
3231
33- let private tryDeserialize < 'T > ( token : JToken ) =
32+ let private tryDeserialize < 'T > ( token : JToken ) =
3433 try
35- Some ( token.ToObject< 'T>())
36- with
37- | _ -> None
34+ Some( token.ToObject< 'T>())
35+ with _ ->
36+ None
3837
3938 /// Create a successful response
4039 let private createSuccessResponse ( id : JToken option ) ( result : obj ) =
4140 { Id = id
42- Result = Some ( JToken.FromObject( result))
41+ Result = Some( JToken.FromObject( result))
4342 Error = None }
4443
4544 /// Create an error response
4645 let private createErrorResponse ( id : JToken option ) ( code : int ) ( message : string ) =
4746 { Id = id
4847 Result = None
49- Error = Some { Code = code; Message = message; Data = None } }
48+ Error =
49+ Some
50+ { Code = code
51+ Message = message
52+ Data = None } }
5053
5154 /// Handle BSP requests
5255 let private handleBspRequest ( request : JsonRpcRequest ) : Task < JsonRpcResponse > =
5356 task {
5457 try
55- logger.info ( Log.setMessage " Handling BSP request: {method}" >> Log.addContext " method" request.Method)
58+ logger.info (
59+ Log.setMessage " Handling BSP request: {method}"
60+ >> Log.addContext " method" request.Method
61+ )
5662
5763 match request.Method with
5864 | " build/initialize" ->
59- let! result = initializeWorkspace()
65+ let! result = initializeWorkspace ()
66+
6067 match result with
61- | Result.Ok () ->
62- let capabilities = {
63- CompileProvider = Some true
64- TestProvider = None
65- RunProvider = None
66- DebugProvider = None
67- InverseSourcesProvider = None
68- DependencySourcesProvider = None
69- DependencyModulesProvider = None
70- ResourcesProvider = None
71- OutputPathsProvider = None
72- BuildTargetChangedProvider = None
73- JvmRunEnvironmentProvider = None
74- JvmTestEnvironmentProvider = None
75- CanReload = Some true
76- }
68+ | Result.Ok() ->
69+ let capabilities =
70+ { CompileProvider = Some true
71+ TestProvider = None
72+ RunProvider = None
73+ DebugProvider = None
74+ InverseSourcesProvider = None
75+ DependencySourcesProvider = None
76+ DependencyModulesProvider = None
77+ ResourcesProvider = None
78+ OutputPathsProvider = None
79+ BuildTargetChangedProvider = None
80+ JvmRunEnvironmentProvider = None
81+ JvmTestEnvironmentProvider = None
82+ CanReload = Some true }
83+
7784 return createSuccessResponse ( Some request.Id) capabilities
78- | Result.Error msg ->
79- return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
85+ | Result.Error msg -> return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
8086
8187 | " build/shutdown" ->
82- let! result = shutdown()
88+ let! result = shutdown ()
89+
8390 match result with
84- | Result.Ok () ->
85- return createSuccessResponse ( Some request.Id) ()
86- | Result.Error msg ->
87- return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
91+ | Result.Ok() -> return createSuccessResponse ( Some request.Id) ()
92+ | Result.Error msg -> return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
8893
8994 | " workspace/buildTargets" ->
9095 // Return empty build targets for now
@@ -97,11 +102,10 @@ module JsonRpcServer =
97102 match tryDeserialize< WorkspacePeekRequest> parameters with
98103 | Some peekRequest ->
99104 let! result = peekWorkspace peekRequest
105+
100106 match result with
101- | Result.Ok response ->
102- return createSuccessResponse ( Some request.Id) response
103- | Result.Error msg ->
104- return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
107+ | Result.Ok response -> return createSuccessResponse ( Some request.Id) response
108+ | Result.Error msg -> return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
105109 | None ->
106110 return createErrorResponse ( Some request.Id) ErrorCodes.InvalidParams " Invalid workspace peek parameters"
107111 | None ->
@@ -112,93 +116,109 @@ module JsonRpcServer =
112116 | Some parameters ->
113117 match tryDeserialize< WorkspaceLoadRequest> parameters with
114118 | Some loadRequest ->
115- let! result = loadWorkspace loadRequest
119+ let! result = loadWorkspace loadRequest
120+
116121 match result with
117- | Result.Ok response ->
118- return createSuccessResponse ( Some request.Id) response
119- | Result.Error msg ->
120- return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
122+ | Result.Ok response -> return createSuccessResponse ( Some request.Id) response
123+ | Result.Error msg -> return createErrorResponse ( Some request.Id) ErrorCodes.InternalError msg
121124 | None ->
122125 return createErrorResponse ( Some request.Id) ErrorCodes.InvalidParams " Invalid workspace load parameters"
123126 | None ->
124127 return createErrorResponse ( Some request.Id) ErrorCodes.InvalidParams " Missing workspace load parameters"
125128
126129 | _ ->
127- logger.warn ( Log.setMessage " Unknown method: {method}" >> Log.addContext " method" request.Method)
130+ logger.warn (
131+ Log.setMessage " Unknown method: {method}"
132+ >> Log.addContext " method" request.Method
133+ )
134+
128135 return createErrorResponse ( Some request.Id) ErrorCodes.MethodNotFound $" Method not found: {request.Method}"
129- with
130- | ex ->
131- logger.error ( Log.setMessage " Error handling request: {error}" >> Log.addContext " error" ex.Message)
136+ with ex ->
137+ logger.error (
138+ Log.setMessage " Error handling request: {error}"
139+ >> Log.addContext " error" ex.Message
140+ )
141+
132142 return createErrorResponse ( Some request.Id) ErrorCodes.InternalError ex.Message
133143 }
134144
135145 /// Handle JSON RPC notifications
136146 let private handleNotification ( notification : JsonRpcNotification ) : Task < unit > =
137147 task {
138148 try
139- logger.info ( Log.setMessage " Handling notification: {method}" >> Log.addContext " method" notification.Method)
140-
149+ logger.info (
150+ Log.setMessage " Handling notification: {method}"
151+ >> Log.addContext " method" notification.Method
152+ )
153+
141154 match notification.Method with
142155 | " build/exit" ->
143156 logger.info ( Log.setMessage " Received exit notification" )
144157 Environment.Exit( 0 )
145158 | _ ->
146- logger.warn ( Log.setMessage " Unknown notification method: {method}" >> Log.addContext " method" notification.Method)
147- with
148- | ex ->
149- logger.error ( Log.setMessage " Error handling notification: {error}" >> Log.addContext " error" ex.Message)
159+ logger.warn (
160+ Log.setMessage " Unknown notification method: {method}"
161+ >> Log.addContext " method" notification.Method
162+ )
163+ with ex ->
164+ logger.error (
165+ Log.setMessage " Error handling notification: {error}"
166+ >> Log.addContext " error" ex.Message
167+ )
150168 }
151169
152170 /// Process a single JSON RPC message
153171 let processMessage ( messageText : string ) : Task < string option > =
154172 task {
155173 try
156174 let message = JObject.Parse( messageText)
157-
175+
158176 if message.ContainsKey( " id" ) then
159177 // This is a request
160178 let request = message.ToObject< JsonRpcRequest>()
161179 let! response = handleBspRequest request
162- return Some ( serialize response)
180+ return Some( serialize response)
163181 else
164182 // This is a notification
165183 let notification = message.ToObject< JsonRpcNotification>()
166184 do ! handleNotification notification
167185 return None
168- with
169- | ex ->
170- logger.error ( Log.setMessage " Error processing message: {error}" >> Log.addContext " error" ex.Message)
186+ with ex ->
187+ logger.error (
188+ Log.setMessage " Error processing message: {error}"
189+ >> Log.addContext " error" ex.Message
190+ )
191+
171192 let errorResponse = createErrorResponse None ErrorCodes.ParseError " Parse error"
172- return Some ( serialize errorResponse)
193+ return Some( serialize errorResponse)
173194 }
174195
175196 /// Main server loop for stdin/stdout communication
176197 let runServer () =
177198 task {
178199 logger.info ( Log.setMessage " Starting JSON RPC server..." )
179-
200+
180201 use reader = new StreamReader( Console.OpenStandardInput())
181202 use writer = new StreamWriter( Console.OpenStandardOutput())
182203 writer.AutoFlush <- true
183204
184205 let mutable keepRunning = true
185-
206+
186207 while keepRunning do
187208 try
188209 let! line = reader.ReadLineAsync()
210+
189211 if not ( isNull line) then
190212 let! response = processMessage line
213+
191214 match response with
192- | Some responseText ->
193- do ! writer.WriteLineAsync( responseText)
194- | None ->
195- () // No response needed for notifications
215+ | Some responseText -> do ! writer.WriteLineAsync( responseText)
216+ | None -> () // No response needed for notifications
196217 else
197218 keepRunning <- false
198- with
199- | ex ->
219+ with ex ->
200220 logger.error ( Log.setMessage " Server loop error: {error}" >> Log.addContext " error" ex.Message)
201221 keepRunning <- false
202-
222+
203223 logger.info ( Log.setMessage " JSON RPC server stopped" )
204- }
224+ }
0 commit comments