content: {-# LANGUAGE NoImplicitPrelude #-}
  
  {-|
  Module      : Stack.Types.PackageName
  Description : Names for packages.
  License     : BSD-3-Clause
  
  Names for packages.
  -}
  
  module Stack.Types.PackageName
    ( packageNameArgument
    ) where
  
  import qualified Options.Applicative as O
  import           Stack.Prelude
  
  -- | An argument which accepts a template name of the format
  -- @foo.hsfiles@.
  packageNameArgument ::
       O.Mod O.ArgumentFields PackageName
    -> O.Parser PackageName
  packageNameArgument =
    O.argument
      (do s <- O.str
          either O.readerError pure (p s))
   where
    p s =
      case parsePackageName s of
        Just x -> Right x
        Nothing -> Left $ unlines
          [ "Expected a package name acceptable to Cabal, but got: " ++ s ++ "\n"
          , "An acceptable package name comprises an alphanumeric 'word'; or \
            \two or more"
          , "such words, with the words separated by a hyphen/minus character ('-'). A \
            \word"
          , "cannot be comprised only of the characters '0' to '9'. \n"
          , "An alphanumeric character is one in one of the Unicode Letter \
            \categories"
          , "(Lu (uppercase), Ll (lowercase), Lt (titlecase), Lm (modifier), or \
            \Lo (other))"
          , "or Number categories (Nd (decimal), Nl (letter), or No (other))."
          ]
  