(:~ handle text messages
 : @author andy bunce
 :)
module namespace lsp-text = 'lsp-text';
import module namespace p="xq4" at "xq4.xqm";

declare variable $lsp-text:methods:=map{
  "textDocument/didOpen": lsp-text:didOpen#1,
  "textDocument/didClose" : lsp-text:method-unknown#1,
  "textDocument/didChange": lsp-text:method-unknown#1,
  "textDocument/hover":  lsp-text:hover#1,
  "textDocument/completion": lsp-text:completion#1
};
(:~  hover

:)
declare
function lsp-text:hover($json as map(*)) 
as map(*)?
{
 let $doc:=$json?params?textDocument?uri
 return map{
    "jsonrpc": "2.0",
    "id": $json?id,
    "result":{
  "contents": [
    {
      "language": "markdown",
      "value": `markdown: this is **bold** 
      a [link](http://google.com)
      The last line.`
    },
    {
      "language": "plaintext",
      "value": "plaintext: A hover for " || json:serialize($json?params?position)
    }]
}
  }
};

declare
function lsp-text:completion($json as map(*)) 
as map(*)?
{
 let $doc:=$json?params?textDocument?uri
 return map{
    "jsonrpc": "2.0",
    "id": $json?id,
    "result":()
  }
};

(:~  didOpen method response :)
declare
function lsp-text:didOpen($json as map(*)) 
as map(*)?
{
 let $textDoc:=$json?params?textDocument

 let $x:=job:eval(xs:anyURI("parse.xq"),
             {"textDocument":$textDoc,"webSocket":ws:id()},
             { 'cache': true() }
             )
 
 return ws:set(ws:id(),$textDoc?uri,$textDoc)
};

(:~  unknown method response :)
declare
function lsp-text:method-unknown($json as map(*)) 
as map(*)?
{
 let $_:=trace($json?method,"unknown")
 return ()
};