on master help sign in
Allow to construct a PkgName only with a valid package name
commit8f7c6a92871e94608f53eedc3d4583efb53b27a6 authorVincent Hanquez <vincent@snarc.org> dateSun 27 Aug 2017, 11:53 (9 years ago) parentf732f9d
3 files changed+13−4
src/Idris/Imports.hs+9−2 src/Idris/Package/Parser.hs+1−1 src/Idris/REPL/Parser.hs+3−1
src/Idris/Imports.hs+9−2
@@ -19,6 +19,7 @@ import IRTS.System (getIdrisLibDir)
1919import Control.Applicative ((<$>))
2020import Control.Monad.State.Strict
2121import Data.List (isSuffixOf)
22+import Data.Char (isLower, isDigit)
2223import System.Directory
2324import System.FilePath
2425
@@ -31,8 +32,14 @@ newtype PkgName = PkgName { unPkgName :: String }
3132unInitializedPkgName :: PkgName
3233unInitializedPkgName = PkgName ""
3334
34−pkgName :: String -> PkgName
35−pkgName = PkgName
35+pkgName :: String -> Either String PkgName
36+pkgName "" = Left "empty package name"
37+pkgName s@(f:l)
38+ | not $ isLower f =
39+ Left "package name need to start by a lower alpha"
40+ | not $ all (\c -> isLower c || isDigit c || c `elem` "-_") l =
41+ Left "package name need to contain only lower alpha, digits, and -_"
42+ | otherwise = Right $ PkgName s
3643
3744-- | Get the index file name for a package name
3845pkgIndex :: PkgName -> FilePath
src/Idris/Package/Parser.hs+1−1
@@ -75,7 +75,7 @@ pPkg = do
7575 return st
7676
7777pPkgName :: PParser PkgName
78−pPkgName = (pkgName <$> packageName) <?> "PkgName"
78+pPkgName = (either fail pure . pkgName =<< packageName) <?> "PkgName"
7979
8080-- | Parses a filename.
8181-- |
src/Idris/REPL/Parser.hs+3−1
@@ -512,12 +512,14 @@ packageBasedCmd :: P.IdrisParser a -> ([PkgName] -> a -> Command)
512512 -> String -> P.IdrisParser (Either String Command)
513513packageBasedCmd valParser cmd name =
514514 try (do P.lchar '('
515− pkgs <- sepBy (pkgName <$> some idChar) (P.lchar ',')
515+ pkgs <- sepBy (pkg <* P.whiteSpace) (P.lchar ',')
516516 P.lchar ')'
517517 val <- valParser
518518 return (Right (cmd pkgs val)))
519519 <|> do val <- valParser
520520 return (Right (cmd [] val))
521+ where
522+ pkg = either fail pure . pkgName =<< P.packageName
521523
522524cmd_search :: String -> P.IdrisParser (Either String Command)
523525cmd_search = packageBasedCmd