--------------------------------------------------------------------------------
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
--------------------------------------------------------------------------------

{-# LANGUAGE Safe #-}
{-# LANGUAGE ExistentialQuantification, GADTs #-}

module Copilot.Core.Type.Read
  ( ReadWit (..)
  , readWit
  , readWithType
  ) where

import Copilot.Core.Type
import Copilot.Core.Error (badUsage)

--------------------------------------------------------------------------------

data ReadWit a = Read a => ReadWit

--------------------------------------------------------------------------------

readWit :: Type a -> ReadWit a
readWit :: Type a -> ReadWit a
readWit Type a
t =
  case Type a
t of
    Type a
Bool   -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Int8   -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Int16  -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Int32  -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Int64  -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Word8  -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Word16 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Word32 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Word64 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Float  -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
    Type a
Double -> ReadWit a
forall a. Read a => ReadWit a
ReadWit

--------------------------------------------------------------------------------

readWithType :: Type a -> String -> a
readWithType :: Type a -> String -> a
readWithType Type a
t String
str =
  case Type a
t of
    Type a
Bool -> case String
str of
              String
"0" -> a
Bool
False
              String
"1" -> a
Bool
True
              String
x   -> String -> a
forall a. String -> a
badUsage (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
"in readWithType in copilot-core: expecting a \"0\" or \"1\" when reading a Boolean value " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"."
    Type a
_    -> a
rd
  where
  rd :: a
rd = case Type a -> ReadWit a
forall a. Type a -> ReadWit a
readWit Type a
t of
         ReadWit a
ReadWit -> String -> a
forall a. Read a => String -> a
read String
str

--------------------------------------------------------------------------------