{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

module Distribution.Types.LibraryName
  ( LibraryName (..)
  , defaultLibName
  , maybeToLibraryName
  , showLibraryName
  , libraryNameStanza
  , libraryNameString

    -- * Pretty & Parse
  , prettyLibraryNameComponent
  , parsecLibraryNameComponent
  ) where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Parsec
import Distribution.Pretty
import Distribution.Types.UnqualComponentName

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

data LibraryName
  = LMainLibName
  | LSubLibName UnqualComponentName
  deriving (LibraryName -> LibraryName -> Bool
(LibraryName -> LibraryName -> Bool)
-> (LibraryName -> LibraryName -> Bool) -> Eq LibraryName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LibraryName -> LibraryName -> Bool
== :: LibraryName -> LibraryName -> Bool
$c/= :: LibraryName -> LibraryName -> Bool
/= :: LibraryName -> LibraryName -> Bool
Eq, (forall x. LibraryName -> Rep LibraryName x)
-> (forall x. Rep LibraryName x -> LibraryName)
-> Generic LibraryName
forall x. Rep LibraryName x -> LibraryName
forall x. LibraryName -> Rep LibraryName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LibraryName -> Rep LibraryName x
from :: forall x. LibraryName -> Rep LibraryName x
$cto :: forall x. Rep LibraryName x -> LibraryName
to :: forall x. Rep LibraryName x -> LibraryName
Generic, Eq LibraryName
Eq LibraryName =>
(LibraryName -> LibraryName -> Ordering)
-> (LibraryName -> LibraryName -> Bool)
-> (LibraryName -> LibraryName -> Bool)
-> (LibraryName -> LibraryName -> Bool)
-> (LibraryName -> LibraryName -> Bool)
-> (LibraryName -> LibraryName -> LibraryName)
-> (LibraryName -> LibraryName -> LibraryName)
-> Ord LibraryName
LibraryName -> LibraryName -> Bool
LibraryName -> LibraryName -> Ordering
LibraryName -> LibraryName -> LibraryName
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LibraryName -> LibraryName -> Ordering
compare :: LibraryName -> LibraryName -> Ordering
$c< :: LibraryName -> LibraryName -> Bool
< :: LibraryName -> LibraryName -> Bool
$c<= :: LibraryName -> LibraryName -> Bool
<= :: LibraryName -> LibraryName -> Bool
$c> :: LibraryName -> LibraryName -> Bool
> :: LibraryName -> LibraryName -> Bool
$c>= :: LibraryName -> LibraryName -> Bool
>= :: LibraryName -> LibraryName -> Bool
$cmax :: LibraryName -> LibraryName -> LibraryName
max :: LibraryName -> LibraryName -> LibraryName
$cmin :: LibraryName -> LibraryName -> LibraryName
min :: LibraryName -> LibraryName -> LibraryName
Ord, ReadPrec [LibraryName]
ReadPrec LibraryName
Int -> ReadS LibraryName
ReadS [LibraryName]
(Int -> ReadS LibraryName)
-> ReadS [LibraryName]
-> ReadPrec LibraryName
-> ReadPrec [LibraryName]
-> Read LibraryName
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS LibraryName
readsPrec :: Int -> ReadS LibraryName
$creadList :: ReadS [LibraryName]
readList :: ReadS [LibraryName]
$creadPrec :: ReadPrec LibraryName
readPrec :: ReadPrec LibraryName
$creadListPrec :: ReadPrec [LibraryName]
readListPrec :: ReadPrec [LibraryName]
Read, Int -> LibraryName -> ShowS
[LibraryName] -> ShowS
LibraryName -> String
(Int -> LibraryName -> ShowS)
-> (LibraryName -> String)
-> ([LibraryName] -> ShowS)
-> Show LibraryName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LibraryName -> ShowS
showsPrec :: Int -> LibraryName -> ShowS
$cshow :: LibraryName -> String
show :: LibraryName -> String
$cshowList :: [LibraryName] -> ShowS
showList :: [LibraryName] -> ShowS
Show, Typeable, Typeable LibraryName
Typeable LibraryName =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> LibraryName -> c LibraryName)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c LibraryName)
-> (LibraryName -> Constr)
-> (LibraryName -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c LibraryName))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c LibraryName))
-> ((forall b. Data b => b -> b) -> LibraryName -> LibraryName)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> LibraryName -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> LibraryName -> r)
-> (forall u. (forall d. Data d => d -> u) -> LibraryName -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> LibraryName -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> LibraryName -> m LibraryName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LibraryName -> m LibraryName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LibraryName -> m LibraryName)
-> Data LibraryName
LibraryName -> Constr
LibraryName -> DataType
(forall b. Data b => b -> b) -> LibraryName -> LibraryName
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> LibraryName -> u
forall u. (forall d. Data d => d -> u) -> LibraryName -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LibraryName
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LibraryName -> c LibraryName
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LibraryName)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c LibraryName)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LibraryName -> c LibraryName
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LibraryName -> c LibraryName
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LibraryName
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LibraryName
$ctoConstr :: LibraryName -> Constr
toConstr :: LibraryName -> Constr
$cdataTypeOf :: LibraryName -> DataType
dataTypeOf :: LibraryName -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LibraryName)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LibraryName)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c LibraryName)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c LibraryName)
$cgmapT :: (forall b. Data b => b -> b) -> LibraryName -> LibraryName
gmapT :: (forall b. Data b => b -> b) -> LibraryName -> LibraryName
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LibraryName -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> LibraryName -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> LibraryName -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LibraryName -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LibraryName -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LibraryName -> m LibraryName
Data)

instance Binary LibraryName
instance Structured LibraryName
instance NFData LibraryName where rnf :: LibraryName -> ()
rnf = LibraryName -> ()
forall a. (Generic a, GNFData (Rep a)) => a -> ()
genericRnf

-- | Pretty print 'LibraryName' in build-target-ish syntax.
--
-- /Note:/ there are no 'Pretty' or 'Parsec' instances,
-- as there's other way to represent 'LibraryName', namely as bare
-- 'UnqualComponentName'.
prettyLibraryNameComponent :: LibraryName -> Disp.Doc
prettyLibraryNameComponent :: LibraryName -> Doc
prettyLibraryNameComponent LibraryName
LMainLibName = String -> Doc
Disp.text String
"lib"
prettyLibraryNameComponent (LSubLibName UnqualComponentName
str) = String -> Doc
Disp.text String
"lib:" Doc -> Doc -> Doc
<<>> UnqualComponentName -> Doc
forall a. Pretty a => a -> Doc
pretty UnqualComponentName
str

parsecLibraryNameComponent :: CabalParsing m => m LibraryName
parsecLibraryNameComponent :: forall (m :: * -> *). CabalParsing m => m LibraryName
parsecLibraryNameComponent = do
  String
_ <- String -> m String
forall (m :: * -> *). CharParsing m => String -> m String
P.string String
"lib"
  m LibraryName
parseComposite m LibraryName -> m LibraryName -> m LibraryName
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> m LibraryName
parseSingle
  where
    parseSingle :: m LibraryName
parseSingle = LibraryName -> m LibraryName
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return LibraryName
LMainLibName
    parseComposite :: m LibraryName
parseComposite = do
      Char
_ <- Char -> m Char
forall (m :: * -> *). CharParsing m => Char -> m Char
P.char Char
':'
      UnqualComponentName -> LibraryName
LSubLibName (UnqualComponentName -> LibraryName)
-> m UnqualComponentName -> m LibraryName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m UnqualComponentName
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
forall (m :: * -> *). CabalParsing m => m UnqualComponentName
parsec

defaultLibName :: LibraryName
defaultLibName :: LibraryName
defaultLibName = LibraryName
LMainLibName

showLibraryName :: LibraryName -> String
showLibraryName :: LibraryName -> String
showLibraryName LibraryName
LMainLibName = String
"library"
showLibraryName (LSubLibName UnqualComponentName
name) = String
"library '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow UnqualComponentName
name String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"'"

libraryNameStanza :: LibraryName -> String
libraryNameStanza :: LibraryName -> String
libraryNameStanza LibraryName
LMainLibName = String
"library"
libraryNameStanza (LSubLibName UnqualComponentName
name) = String
"library " String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow UnqualComponentName
name

libraryNameString :: LibraryName -> Maybe UnqualComponentName
libraryNameString :: LibraryName -> Maybe UnqualComponentName
libraryNameString LibraryName
LMainLibName = Maybe UnqualComponentName
forall a. Maybe a
Nothing
libraryNameString (LSubLibName UnqualComponentName
n) = UnqualComponentName -> Maybe UnqualComponentName
forall a. a -> Maybe a
Just UnqualComponentName
n

-- | Convert the 'UnqualComponentName' of a library into a
-- 'LibraryName'.
maybeToLibraryName :: Maybe UnqualComponentName -> LibraryName
maybeToLibraryName :: Maybe UnqualComponentName -> LibraryName
maybeToLibraryName Maybe UnqualComponentName
Nothing = LibraryName
LMainLibName
maybeToLibraryName (Just UnqualComponentName
n) = UnqualComponentName -> LibraryName
LSubLibName UnqualComponentName
n