Distribution/Types/LibraryName.hs

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

    module Distribution.Types.LibraryName (
      LibraryName(..),
      defaultLibName,
      maybeToLibraryName,
      showLibraryName,
      libraryNameStanza,
      libraryNameString,
      -- * Pretty & Parse
      prettyLibraryNameComponent,
      parsecLibraryNameComponent,
      ) where

    import Prelude ()
    import Distribution.Compat.Prelude

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

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

    data LibraryName = LMainLibName
                     | LSubLibName UnqualComponentName
                     deriving (Eq, Generic, Ord, Read, Show, Typeable, Data)

    instance Binary LibraryName
    instance Structured LibraryName
    instance NFData LibraryName where rnf = 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 LMainLibName      = Disp.text "lib"
    prettyLibraryNameComponent (LSubLibName str) = Disp.text "lib:" <<>> pretty str

    parsecLibraryNameComponent :: CabalParsing m => m LibraryName
    parsecLibraryNameComponent = do
        _ <- P.string "lib"
        parseComposite <|> parseSingle
      where
        parseSingle = return LMainLibName
        parseComposite = do
            _ <- P.char ':'
            LSubLibName <$> parsec

    defaultLibName :: LibraryName
    defaultLibName = LMainLibName

    showLibraryName :: LibraryName -> String
    showLibraryName LMainLibName       = "library"
    showLibraryName (LSubLibName name) = "library '" ++ prettyShow name ++ "'"

    libraryNameStanza :: LibraryName -> String
    libraryNameStanza LMainLibName       = "library"
    libraryNameStanza (LSubLibName name) = "library " ++ prettyShow name

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

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