Add function to unwrap Results logging failures
authorMichele Tartara <mtartara@google.com>
Wed, 21 Aug 2013 14:15:30 +0000 (14:15 +0000)
committerMichele Tartara <mtartara@google.com>
Wed, 21 Aug 2013 15:18:40 +0000 (15:18 +0000)
Add logWarningIfBad, a utility function similar to exitIfBad, that logs a
warning and returns a default value instead of just crashing the program if
the unpacked value is Bad.

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Klaus Aehlig <aehlig@google.com>

src/Ganeti/Utils.hs

index 51aa671..026db21 100644 (file)
@@ -43,6 +43,7 @@ module Ganeti.Utils
   , exitErr
   , exitWhen
   , exitUnless
+  , logWarningIfBad
   , rStripSpace
   , newUUID
   , getCurrentTime
@@ -69,6 +70,7 @@ import Debug.Trace
 
 import Ganeti.BasicTypes
 import qualified Ganeti.Constants as C
+import Ganeti.Logging
 import Ganeti.Runtime
 import System.IO
 import System.Exit
@@ -252,6 +254,14 @@ exitWhen False _  = return ()
 exitUnless :: Bool -> String -> IO ()
 exitUnless cond = exitWhen (not cond)
 
+-- | Unwraps a 'Result', logging a warning message and then returning a default
+-- value if it is a 'Bad' value, otherwise returning the actual contained value.
+logWarningIfBad :: String -> a -> Result a -> IO a
+logWarningIfBad msg defVal (Bad s) = do
+  logWarning $ msg ++ ": " ++ s
+  return defVal
+logWarningIfBad _ _ (Ok v) = return v
+
 -- | Print a warning, but do not exit.
 warn :: String -> IO ()
 warn = hPutStrLn stderr . (++) "Warning: "