module GHC.Settings.Utils where
import Prelude
import Data.Char (isSpace)
import Data.Map (Map)
import qualified Data.Map as Map
import GHC.BaseDir
import GHC.Platform.ArchOS
import System.FilePath
maybeRead :: Read a => String -> Maybe a
maybeRead :: forall a. Read a => [Char] -> Maybe a
maybeRead [Char]
str = case ReadS a
forall a. Read a => ReadS a
reads [Char]
str of
[(a
x, [Char]
"")] -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
[(a, [Char])]
_ -> Maybe a
forall a. Maybe a
Nothing
maybeReadFuzzy :: Read a => String -> Maybe a
maybeReadFuzzy :: forall a. Read a => [Char] -> Maybe a
maybeReadFuzzy [Char]
str = case ReadS a
forall a. Read a => ReadS a
reads [Char]
str of
[(a
x, [Char]
s)] | (Char -> Bool) -> [Char] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace [Char]
s -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
[(a, [Char])]
_ -> Maybe a
forall a. Maybe a
Nothing
type RawSettings = Map String String
getTargetArchOS
:: FilePath
-> RawSettings
-> Either String ArchOS
getTargetArchOS :: [Char] -> RawSettings -> Either [Char] ArchOS
getTargetArchOS [Char]
settingsFile RawSettings
settings =
Arch -> OS -> ArchOS
ArchOS (Arch -> OS -> ArchOS)
-> Either [Char] Arch -> Either [Char] (OS -> ArchOS)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> RawSettings -> [Char] -> Either [Char] Arch
forall a.
(Show a, Read a) =>
[Char] -> RawSettings -> [Char] -> Either [Char] a
readRawSetting [Char]
settingsFile RawSettings
settings [Char]
"target arch"
Either [Char] (OS -> ArchOS)
-> Either [Char] OS -> Either [Char] ArchOS
forall a b.
Either [Char] (a -> b) -> Either [Char] a -> Either [Char] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Char] -> RawSettings -> [Char] -> Either [Char] OS
forall a.
(Show a, Read a) =>
[Char] -> RawSettings -> [Char] -> Either [Char] a
readRawSetting [Char]
settingsFile RawSettings
settings [Char]
"target os"
getGlobalPackageDb :: FilePath -> RawSettings -> Either String FilePath
getGlobalPackageDb :: [Char] -> RawSettings -> Either [Char] [Char]
getGlobalPackageDb [Char]
settingsFile RawSettings
settings = do
rel_db <- [Char] -> RawSettings -> [Char] -> Either [Char] [Char]
getRawSetting [Char]
settingsFile RawSettings
settings [Char]
"Relative Global Package DB"
return (dropFileName settingsFile </> rel_db)
getRawSetting
:: FilePath -> RawSettings -> String -> Either String String
getRawSetting :: [Char] -> RawSettings -> [Char] -> Either [Char] [Char]
getRawSetting [Char]
settingsFile RawSettings
settings [Char]
key = case [Char] -> RawSettings -> Maybe [Char]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup [Char]
key RawSettings
settings of
Just [Char]
xs -> [Char] -> Either [Char] [Char]
forall a b. b -> Either a b
Right [Char]
xs
Maybe [Char]
Nothing -> [Char] -> Either [Char] [Char]
forall a b. a -> Either a b
Left ([Char] -> Either [Char] [Char]) -> [Char] -> Either [Char] [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"No entry for " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" in " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
settingsFile
getRawFilePathSetting
:: FilePath -> FilePath -> RawSettings -> String -> Either String String
getRawFilePathSetting :: [Char] -> [Char] -> RawSettings -> [Char] -> Either [Char] [Char]
getRawFilePathSetting [Char]
top_dir [Char]
settingsFile RawSettings
settings [Char]
key =
[Char] -> [Char] -> [Char]
expandTopDir [Char]
top_dir ([Char] -> [Char]) -> Either [Char] [Char] -> Either [Char] [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> RawSettings -> [Char] -> Either [Char] [Char]
getRawSetting [Char]
settingsFile RawSettings
settings [Char]
key
getRawBooleanSetting
:: FilePath -> RawSettings -> String -> Either String Bool
getRawBooleanSetting :: [Char] -> RawSettings -> [Char] -> Either [Char] Bool
getRawBooleanSetting [Char]
settingsFile RawSettings
settings [Char]
key = do
rawValue <- [Char] -> RawSettings -> [Char] -> Either [Char] [Char]
getRawSetting [Char]
settingsFile RawSettings
settings [Char]
key
case rawValue of
[Char]
"YES" -> Bool -> Either [Char] Bool
forall a b. b -> Either a b
Right Bool
True
[Char]
"NO" -> Bool -> Either [Char] Bool
forall a b. b -> Either a b
Right Bool
False
[Char]
xs -> [Char] -> Either [Char] Bool
forall a b. a -> Either a b
Left ([Char] -> Either [Char] Bool) -> [Char] -> Either [Char] Bool
forall a b. (a -> b) -> a -> b
$ [Char]
"Bad value for " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
": " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
xs
readRawSetting
:: (Show a, Read a) => FilePath -> RawSettings -> String -> Either String a
readRawSetting :: forall a.
(Show a, Read a) =>
[Char] -> RawSettings -> [Char] -> Either [Char] a
readRawSetting [Char]
settingsFile RawSettings
settings [Char]
key = case [Char] -> RawSettings -> Maybe [Char]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup [Char]
key RawSettings
settings of
Just [Char]
xs -> case [Char] -> Maybe a
forall a. Read a => [Char] -> Maybe a
maybeRead [Char]
xs of
Just a
v -> a -> Either [Char] a
forall a b. b -> Either a b
Right a
v
Maybe a
Nothing -> [Char] -> Either [Char] a
forall a b. a -> Either a b
Left ([Char] -> Either [Char] a) -> [Char] -> Either [Char] a
forall a b. (a -> b) -> a -> b
$ [Char]
"Failed to read " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" value " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
xs
Maybe [Char]
Nothing -> [Char] -> Either [Char] a
forall a b. a -> Either a b
Left ([Char] -> Either [Char] a) -> [Char] -> Either [Char] a
forall a b. (a -> b) -> a -> b
$ [Char]
"No entry for " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" in " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
settingsFile