As part of my beginner’s project I’m decoding JSON that I read from a file. For readTextFile
I’m in
Eff ( fs ∷ FS , exception ∷ EXCEPTION | eff )
anyway, but decodeJSON
fails in ExceptT (NonEmptyList ForeignError)
. I can use runExcept
and handle he cases with either
, but I’m wondering if its possible to convert the Except
into a native exception using catchError
to handle the decoding error and re-throw it as an a native exception.
I had a go in the stacked monad:
readJson ::
forall eff value.
Decode value =>
String ->
ExceptT (NonEmptyList ForeignError) (Eff (fs :: FS, exception :: EXCEPTION |eff)) value
readJson fileName =
do
s <- lift $ readTextFile UTF8 fileName
v <- rewrap (decodeJSON s) `catchError` rethrow s
pure v
where
rewrap = mapExceptT (un Identity >>> pure)
rethrow content e = lift $ throw $ "Couldn't decode JSON:" <> content
Is there a way to do this where I end up in Eff (fs: FS, exception: EXCEPTION |eff)
without having to case on the error?