{-# LANGUAGE TemplateHaskell, PackageImports #-} module HsDev.Version ( cabalVersion ) where import Data.Char import Data.List import Data.Maybe import "template-haskell" Language.Haskell.TH cabalVersion :: ExpQ cabalVersion :: ExpQ cabalVersion = do String s <- IO String -> Q String forall a. IO a -> Q a runIO (String -> IO String readFile String "hsdev.cabal") let version :: Maybe String version = [String] -> Maybe String forall a. [a] -> Maybe a listToMaybe ([String] -> Maybe String) -> [String] -> Maybe String forall a b. (a -> b) -> a -> b $ (String -> String) -> [String] -> [String] forall a b. (a -> b) -> [a] -> [b] map ((Char -> Bool) -> String -> String forall a. (a -> Bool) -> [a] -> [a] dropWhile Char -> Bool isSpace) ([String] -> [String]) -> [String] -> [String] forall a b. (a -> b) -> a -> b $ (String -> Maybe String) -> [String] -> [String] forall a b. (a -> Maybe b) -> [a] -> [b] mapMaybe (String -> String -> Maybe String forall a. Eq a => [a] -> [a] -> Maybe [a] stripPrefix String "version:") ([String] -> [String]) -> [String] -> [String] forall a b. (a -> b) -> a -> b $ String -> [String] lines String s ExpQ -> (String -> ExpQ) -> Maybe String -> ExpQ forall b a. b -> (a -> b) -> Maybe a -> b maybe (String -> ExpQ forall (m :: * -> *) a. MonadFail m => String -> m a fail String "Can't detect version") (\String v -> [e| v |]) Maybe String version