79 lines
1.7 KiB
Text
79 lines
1.7 KiB
Text
(:~
|
|
: jsonrpc
|
|
: @author andy bunce
|
|
:)
|
|
module namespace lsprpc = 'lsprpc';
|
|
import module namespace lsp-text = 'lsp-text' at "lsp-text.xqm";
|
|
|
|
(: map methods to functions :)
|
|
declare variable $lsprpc:methods:=map:merge((
|
|
map{
|
|
"initialize" : lsprpc:method-initialize#1,
|
|
"initialized" : lsprpc:method-unknown#1,
|
|
"workspace/didChangeConfiguration" :lsprpc:method-unknown#1
|
|
},
|
|
$lsp-text:methods
|
|
));
|
|
|
|
(:~ 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": $json?id,
|
|
"result": {
|
|
"capabilities": {
|
|
"textDocumentSync": 2,
|
|
"completionProvider": {
|
|
"resolveProvider": false(),
|
|
"triggerCharacters": [ """", ":" ]
|
|
},
|
|
"hoverProvider": true(),
|
|
"documentSymbolProvider": true(),
|
|
"documentRangeFormattingProvider": false(),
|
|
"colorProvider": {},
|
|
"foldingRangeProvider": true(),
|
|
"selectionRangeProvider": true(),
|
|
"documentLinkProvider": {}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
(:~ unknown method response :)
|
|
declare
|
|
function lsprpc:method-unknown($json as map(*))
|
|
as map(*)?
|
|
{
|
|
let $_:=trace($json?method,"unknown")
|
|
return ()
|
|
};
|
|
|