Hanzo.hs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. {-# LANGUAGE FlexibleInstances #-}
  2. {-# LANGUAGE ScopedTypeVariables #-}
  3. module Hanzo
  4. ( Mainable(..)
  5. , Termination(..)
  6. , Exit.ExitCode(..)
  7. ) where
  8. import qualified Control.Exception as Exn
  9. import qualified System.Environment as Env
  10. import qualified System.Exit as Exit
  11. import qualified System.IO as IO
  12. class Mainable k where
  13. main :: k -> IO ()
  14. instance Termination r => Mainable (IO r) where
  15. main action = do
  16. exn <- Exn.try action
  17. case exn of
  18. Left (e :: Exn.SomeException) -> do
  19. IO.hPutStrLn IO.stderr (Exn.displayException e)
  20. Right r -> do
  21. code <- report r
  22. Exit.exitWith code
  23. instance Termination r => Mainable ([String] -> IO r) where
  24. main action = do
  25. args <- Env.getArgs
  26. exn <- Exn.try (action args)
  27. case exn of
  28. Left (e :: Exn.SomeException) -> do
  29. IO.hPutStrLn IO.stderr (Exn.displayException e)
  30. Right r -> do
  31. code <- report r
  32. Exit.exitWith code
  33. class Termination t where
  34. report :: t -> IO Exit.ExitCode
  35. instance Termination () where
  36. report _ = pure Exit.ExitSuccess
  37. instance Termination Exit.ExitCode where
  38. report x = pure x
  39. instance Show e => Termination (Either e ()) where
  40. report (Left err) = do
  41. IO.hPutStrLn IO.stderr (show err)
  42. pure (Exit.ExitFailure 1)
  43. report (Right ()) =
  44. pure Exit.ExitSuccess
  45. instance Termination (Maybe ()) where
  46. report Nothing = pure (Exit.ExitFailure 1)
  47. report (Just ()) =
  48. pure Exit.ExitSuccess