src/Distribution/Types/LegacyExeDependency.hs

    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE DeriveGeneric      #-}
    module Distribution.Types.LegacyExeDependency
      ( LegacyExeDependency(..)
      ) where

    import Distribution.Compat.Prelude
    import Prelude ()

    import Distribution.Parsec
    import Distribution.Pretty
    import Distribution.Version (VersionRange, anyVersion)

    import qualified Distribution.Compat.CharParsing as P
    import qualified Text.PrettyPrint                as Disp

    -- | 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.0.2
    data LegacyExeDependency = LegacyExeDependency
                               String
                               VersionRange
                             deriving (Generic, Read, Show, Eq, Typeable, Data)

    instance Binary LegacyExeDependency
    instance Structured LegacyExeDependency
    instance NFData LegacyExeDependency where rnf = genericRnf

    instance Pretty LegacyExeDependency where
        pretty (LegacyExeDependency name ver) =
            Disp.text name <+> pretty ver

    instance Parsec LegacyExeDependency where
        parsec = do
            name <- parsecMaybeQuoted nameP
            P.spaces
            verRange <- parsecMaybeQuoted parsec <|> pure anyVersion
            pure $ LegacyExeDependency name verRange
          where
            nameP = intercalate "-" <$> toList <$> P.sepByNonEmpty component (P.char '-')
            component = do
                cs <- P.munch1 (\c -> isAlphaNum c || c == '+' || c == '_')
                if all isDigit cs then fail "invalid component" else return cs