packages feed

system-uuid-1.1.0: Macros.hs

{-| 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
import Text.Regex


{-| 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"
    return $ case regex <//> s of
      Just [_, _, c]        ->  c
      _                     ->  ""
 where
  regex
    = ".*\nversion([\t ]*):([\t ]*)([[:digit:].]+)"


{-| 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 regex <//> s of
    Just [_, b, _, d]       ->  ('\n':) . normalizeEmptyLines'' $ b ++ d
    _                       ->  ""
 where
  regex
    = ".*\\{-([\t -]*\n)+([ \t]+(SYNOPSIS|USAGE))(.+)\n[-\t ]*-\\}"


 -- normalizeLeadingEmptyLines
normalizeLeadingEmpties      =  ('\n':) . dropWhile (`elem` "\n \t")
normalizeEmptyLines''        =  reverse . normalizeLeadingEmpties . reverse


r <//> s                     =  matchRegex (mkRegexWithOpts r False True) s