content: {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  module Distribution.Types.LegacyExeDependency
    ( LegacyExeDependency(..)
    ) where
  
  import Prelude ()
  import Distribution.Compat.Prelude
  
  import Distribution.Version ( VersionRange, anyVersion )
  
  import qualified Distribution.Compat.ReadP as Parse
  import Distribution.Compat.ReadP
  import Distribution.Text
  
  import Text.PrettyPrint ((<+>), text)
  
  import Distribution.ParseUtils (parseMaybeQuoted)
  
  -- | Describes a legacy `build-tools`-style dependency on an executable
  --
  -- It is "legacy" because we do not know what the build-tool referred to. It
  -- could refer to a pkg-config executable (PkgconfigName), or an internal
  -- executable (UnqualComponentName). Thus the name is stringly typed.
  --
  -- @since 2.0
  data LegacyExeDependency = LegacyExeDependency
                             String
                             VersionRange
                           deriving (Generic, Read, Show, Eq, Typeable, Data)
  
  instance Binary LegacyExeDependency
  instance NFData LegacyExeDependency where rnf = genericRnf
  
  instance Text LegacyExeDependency where
    disp (LegacyExeDependency name ver) =
      text name <+> disp ver
  
    parse = do name <- parseMaybeQuoted parseBuildToolName
               Parse.skipSpaces
               ver <- parse <++ return anyVersion
               Parse.skipSpaces
               return $ LegacyExeDependency name ver
      where
        -- like parsePackageName but accepts symbols in components
        parseBuildToolName :: Parse.ReadP r String
        parseBuildToolName = do ns <- sepBy1 component (Parse.char '-')
                                return (intercalate "-" ns)
          where component = do
                  cs <- munch1 (\c -> isAlphaNum c || c == '+' || c == '_')
                  if all isDigit cs then pfail else return cs
  