module Cryptsy.API.Public.Types.Internal where
import Data.Aeson (Array, Value(Array, Null), withText)
import Data.Aeson.Types (Parser, typeMismatch)
import Data.Monoid (Monoid(mempty))
import Data.Text (unpack)
readsToParser :: String -> ReadS a -> Value -> Parser a
readsToParser name reader = withText name $ trans . reader . unpack
where
trans [] = fail "No parse."
trans [(v, "")] = return v
trans [(_, _ )] = fail "Incomplete parse."
trans _ = fail "Ambiguous parse."
withNullableArray :: Monoid a
=> String -> (Array -> Parser a) -> Value -> Parser a
withNullableArray _ parseArray (Array v) = parseArray v
withNullableArray _ _ Null = return mempty
withNullableArray name _ v = typeMismatch name v