(:~ : jsonrpc : @author andy bunce :) module namespace lsprpc = 'lsprpc'; declare variable $lsprpc:methods:=map{ "initialize" : lsprpc:method-initialize#1, "initialized" : lsprpc:method-unknown#1, "workspace/didChangeConfiguration" :lsprpc:method-unknown#1, "textDocument/didOpen": lsprpc:method-unknown#1, "textDocument/didClose" : lsprpc:method-unknown#1 }; (:~ return map if $msg is jsonrpc else empty :) declare function lsprpc:parse($msg as xs:string) as map(*)? { try { let $json:=parse-json($msg) return if($json?jsonrpc="2.0" and exists($json?method)) then $json else () } catch *{ () } }; (:~ send replay to $json :) declare function lsprpc:reply($json as map(*)) as empty-sequence() { let $method := $json?method let $f :=$lsprpc:methods?($method) let $response := $f!.($json) return if(exists($response)) then ws:send($response=>trace("REPLY: "),ws:id()) }; (:~ canned initialize response :) declare function lsprpc:method-initialize($json as map(*)) as map(*)? { ``[{"jsonrpc":"2.0","id":0, "result":{"capabilities":{"textDocumentSync":2,"completionProvider":{"resolveProvider":false,"triggerCharacters":["\"",":"]},"hoverProvider":true,"documentSymbolProvider":true,"documentRangeFormattingProvider":false,"colorProvider":{},"foldingRangeProvider":true,"selectionRangeProvider":true,"documentLinkProvider":{}}}}]`` =>parse-json() }; (:~ unknown method response :) declare function lsprpc:method-unknown($json as map(*)) as map(*)? { let $_:=trace($json?method,"unknown") return () };