crux-0.7: src/Crux/UI/JS.hs
{-# Language MultiWayIf #-}
{-# Language OverloadedStrings #-}
-- | Utilites for generating JSON
module Crux.UI.JS where
import Data.Text(unpack)
import Data.List(intercalate)
import Data.Maybe(fromMaybe)
import System.Directory( canonicalizePath )
import What4.ProgramLoc
jsLoc :: ProgramLoc -> IO (Maybe JS)
jsLoc x =
case plSourceLoc x of
SourcePos f l c ->
do let fstr = unpack f
fabsolute <-
if | null fstr -> pure ""
| otherwise -> canonicalizePath fstr
pure $ Just $ jsObj
[ "file" ~> jsStr fabsolute
, "line" ~> jsStr (show l)
, "col" ~> jsStr (show c)
]
_ -> pure Nothing
--------------------------------------------------------------------------------
newtype JS = JS { renderJS :: String }
jsList :: [JS] -> JS
jsList xs = JS $ "[" ++ intercalate "," [ x | JS x <- xs ] ++ "]"
infix 1 ~>
(~>) :: a -> b -> (a,b)
(~>) = (,)
jsObj :: [(String,JS)] -> JS
jsObj xs =
JS $ "{" ++ intercalate "," [ show x ++ ": " ++ v | (x,JS v) <- xs ] ++ "}"
jsBool :: Bool -> JS
jsBool b = JS (if b then "true" else "false")
jsStr :: String -> JS
jsStr = JS . show
jsNull :: JS
jsNull = JS "null"
jsMaybe :: Maybe JS -> JS
jsMaybe = fromMaybe jsNull
jsNum :: Show a => a -> JS
jsNum = JS . show
---------------------------------------------------