module GHCi.DAP where

import Data.Word
import qualified Data.Text as T
import qualified Text.Read as R
import qualified Data.Text.Encoding as TE
import qualified Data.ByteString as BS

-- |

--   Encode DAP Request Argument to [Word8] Show String.

--

encode :: Show a
       => a
       -> String
encode :: a -> String
encode = [Word8] -> String
forall a. Show a => a -> String
show ([Word8] -> String) -> (a -> [Word8]) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack (ByteString -> [Word8]) -> (a -> ByteString) -> a -> [Word8]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
TE.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show


-- |

--   Decode [Word8] Show String to DAP Request Argument.

--

decode :: Read a
       => String
       -> Either String a
decode :: String -> Either String a
decode String
argsStr = case String -> Either String [Word8]
forall a. Read a => String -> Either String a
R.readEither String
argsStr :: Either String [Word8] of
  Left String
err -> String -> Either String a
forall a b. a -> Either a b
Left (String -> Either String a) -> String -> Either String a
forall a b. (a -> b) -> a -> b
$ String
"read [Word8] failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
argsStr
  Right [Word8]
bs -> case String -> Either String a
forall a. Read a => String -> Either String a
R.readEither ([Word8] -> String
toStr [Word8]
bs) of
    Left String
err -> String -> Either String a
forall a b. a -> Either a b
Left (String -> Either String a) -> String -> Either String a
forall a b. (a -> b) -> a -> b
$ String
"read failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++  ([Word8] -> String
toStr [Word8]
bs)
    Right a
a  -> a -> Either String a
forall a b. b -> Either a b
Right a
a
  where
    toStr :: [Word8] -> String
toStr = Text -> String
T.unpack (Text -> String) -> ([Word8] -> Text) -> [Word8] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
TE.decodeUtf8 (ByteString -> Text) -> ([Word8] -> ByteString) -> [Word8] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word8] -> ByteString
BS.pack