{-# LANGUAGE OverloadedStrings #-}
module StatusNotifier.Util where
import Control.Arrow
import Control.Lens
import DBus.Client
import qualified DBus.Internal.Message as M
import qualified DBus.Internal.Types as T
import qualified DBus.Introspection as I
import qualified Data.ByteString as BS
import qualified Data.Vector.Storable as VS
import Data.Vector.Storable.ByteString
import Language.Haskell.TH
import Network.Socket (ntohl)
import Paths_status_notifier_item ( getDataDir )
import StatusNotifier.TH
import System.FilePath
import System.IO
import System.IO.Unsafe
import System.Log.Handler.Simple
import System.Log.Logger
getXMLDataFile :: String -> IO FilePath
getXMLDataFile filename = (</> filename) . (</> "xml") <$> getDataDir
ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM cond whenTrue whenFalse =
cond >>= (\bool -> if bool then whenTrue else whenFalse)
makeLensesWithLSuffix =
makeLensesWith $
lensRules & lensField .~ \_ _ name ->
[TopName (mkName $ nameBase name ++ "L")]
whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust = flip $ maybe $ return ()
networkToSystemByteOrder :: BS.ByteString -> BS.ByteString
networkToSystemByteOrder original =
vectorToByteString $ VS.map ntohl $ byteStringToVector original
maybeToEither :: b -> Maybe a -> Either b a
maybeToEither = flip maybe Right . Left
makeErrorReply :: ErrorName -> String -> Reply
makeErrorReply e message = ReplyError e [T.toVariant message]
{-# NOINLINE defaultHandler #-}
defaultHandler :: GenericHandler Handle
defaultHandler = unsafePerformIO $ streamHandler stdout INFO
{-# NOINLINE makeDefaultLogger #-}
makeDefaultLogger :: String -> Logger
makeDefaultLogger name =
unsafePerformIO $ getLogger name
logErrorWithDefault ::
Show a => Logger -> b -> String -> Either a b -> IO b
logErrorWithDefault logger def message =
either (\err -> logL logger ERROR (message ++ show err) >> return def) return
exemptUnknownMethod ::
b -> Either M.MethodError b -> Either M.MethodError b
exemptUnknownMethod def eitherV =
case eitherV of
Right _ -> eitherV
Left M.MethodError { M.methodErrorName = errorName } ->
if errorName == errorUnknownMethod
then Right def
else eitherV
exemptAll ::
b -> Either M.MethodError b -> Either M.MethodError b
exemptAll def eitherV =
case eitherV of
Right _ -> eitherV
Left _ -> Right def
infixl 4 <..>
(<..>) :: Functor f => (a -> b) -> f (f a) -> f (f b)
(<..>) = fmap . fmap
infixl 4 <<$>>
(<<$>>) :: (a -> IO b) -> Maybe a -> IO (Maybe b)
fn <<$>> m = sequenceA $ fn <$> m
forkM :: Monad m => (i -> m a) -> (i -> m b) -> i -> m (a, b)
forkM a b i =
do
r1 <- a i
r2 <- b i
return (r1, r2)
tee :: Monad m => (i -> m a) -> (i -> m b) -> i -> m a
tee = (fmap . fmap . fmap) (fmap fst) forkM
(>>=/) :: Monad m => m a -> (a -> m b) -> m a
(>>=/) a = (a >>=) . tee return
getInterfaceAt client bus path =
right (I.parseXML "/") <$> introspect client bus path