0 | module Language.LSP.Message.URI
 1 |
 2 | import Data.Either
 3 | import Data.String.Parser
 4 | import public Data.URI
 5 | import Language.JSON
 6 | import Language.LSP.Message.Derive
 7 | import Language.LSP.Message.Utils
 8 |
 9 | %default total
10 |
11 | ||| Refer to https://microsoft.github.io/language-server-protocol/specification.html#uri
12 | public export
13 | DocumentURI : Type
14 | DocumentURI = URI
15 |
16 | export
17 | ToJSON URI where
18 |   toJSON = JString . show
19 |
20 | export covering
21 | FromJSON URI where
22 |   fromJSON (JString str) = eitherToMaybe (fst <$> parse (uriParser <* eos) str)
23 |   fromJSON _ = neutral
24 |
25 | export
26 | ToJSON v => ToJSON (SortedMap URI v) where
27 |   toJSON m = JObject (map (mapFst show) $ toList $ toJSON <$> m)
28 |
29 | export covering
30 | FromJSON v => FromJSON (SortedMap URI v) where
31 |   fromJSON (JObject xs) = fromList <$> traverse (\(k, v) => (,) <$> fromJSON (JString k) <*> fromJSON v) xs
32 |   fromJSON _ = neutral
33 |