{-| Macros of general use. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} {-# LANGUAGE TemplateHaskell #-} module Macros where import MacroMacros import Language.Haskell.TH import Language.Haskell.TH.Syntax import Data.List import Control.Applicative {-| Just a macro to pull in a file. -} pullFile f = lift =<< runIO (readFile f) {-| Extract the version from the Cabal file and place it here as string. -} version = lift =<< do runIO $ do s <- readFile "system-uuid.cabal" case filter version (lines s) of v:_ -> return (break_version v) [ ] -> error "Could not find version :(" where version line = "version" == take 7 line break_version = snd . break (/= ' ') . drop 1 . snd . break (== ':') {-| Extract the usage from the module we're in and put it here. -} usage = lift =<< do p <- $(presentFile) runIO $ do s <- readFile p return $ extractUsage s where fileName mod = map replace mod ++ ".hs" replace '.' = '/' replace c = c {-| Pulls the usage out of the comments in a file, digging through the file to find a comment with no text before the @SYNOPSIS@ or @USAGE@, and then treating all the text of the comment as the usage statement. -} extractUsage s = case (begins_with_USAGE |--| terminal_comment) (lines s) of lines -> unlines lines [ ] -> error "Could not find USAGE :(" where a |--| b = takeWhile (not . b) . dropWhile (not . a) begins_with_USAGE line = " USAGE: " == take 8 line terminal_comment line = "-}" == drop (length line - 2) line