config: refactor config reading
This commit is contained in:
parent
57ea8696e7
commit
3a10e3e72c
6 changed files with 153 additions and 96 deletions
|
@ -6,9 +6,6 @@ module Myriad.Core
|
|||
, ImageName
|
||||
, EvalResult(..)
|
||||
, Env(..)
|
||||
, MyriadConfig(..)
|
||||
, DefaultLanguageConfig(..)
|
||||
, LanguageConfig(..)
|
||||
, MyriadT
|
||||
, runMyriadT
|
||||
, initEnv
|
||||
|
@ -32,78 +29,30 @@ import qualified Data.ByteString.Lazy as BL
|
|||
import qualified Data.Map.Strict as M
|
||||
import Data.Snowflake
|
||||
import qualified Data.Text as T
|
||||
import Data.YAML
|
||||
|
||||
import Control.Concurrent.MVar.Lifted
|
||||
import Control.Concurrent.QSem.Lifted
|
||||
import System.Process.Typed
|
||||
|
||||
type Language = T.Text
|
||||
import Myriad.Config
|
||||
|
||||
type ContainerName = String
|
||||
|
||||
type ImageName = String
|
||||
|
||||
data EvalResult = EvalOk BL.ByteString | EvalTimedOut | EvalErrored
|
||||
|
||||
data Env = Env
|
||||
{ config :: MyriadConfig
|
||||
{ config :: Config
|
||||
, languagesDir :: FilePath
|
||||
, containers :: MVar (M.Map Language ContainerName)
|
||||
, containerSems :: MVar (M.Map Language QSem)
|
||||
, evalSems :: MVar (M.Map Language QSem)
|
||||
, containers :: MVar (M.Map LanguageName ContainerName)
|
||||
, containerSems :: MVar (M.Map LanguageName QSem)
|
||||
, evalSems :: MVar (M.Map LanguageName QSem)
|
||||
, snowflakeGen :: SnowflakeGen
|
||||
}
|
||||
|
||||
data MyriadConfig = MyriadConfig
|
||||
{ languages :: [LanguageConfig]
|
||||
, defaultLanguage :: DefaultLanguageConfig
|
||||
, buildConcurrently :: Bool
|
||||
, prepareContainers :: Bool
|
||||
, cleanupInterval :: Int
|
||||
, port :: Int
|
||||
} deriving (Show)
|
||||
|
||||
instance FromYAML MyriadConfig where
|
||||
parseYAML = withMap "config" $ \m -> MyriadConfig
|
||||
<$> m .: "languages"
|
||||
<*> m .: "defaultLanguage"
|
||||
<*> m .: "buildConcurrently"
|
||||
<*> m .: "prepareContainers"
|
||||
<*> m .: "cleanupInterval"
|
||||
<*> m .: "port"
|
||||
|
||||
data DefaultLanguageConfig = DefaultLanguageConfig
|
||||
{ defMemory :: T.Text
|
||||
, defCpus :: Double
|
||||
, defTimeout :: Int
|
||||
, defConcurrent :: Int
|
||||
, defRetries :: Int
|
||||
} deriving (Show)
|
||||
|
||||
instance FromYAML DefaultLanguageConfig where
|
||||
parseYAML = withMap "default language" $ \m -> DefaultLanguageConfig
|
||||
<$> m .: "memory"
|
||||
<*> m .: "cpus"
|
||||
<*> m .: "timeout"
|
||||
<*> m .: "concurrent"
|
||||
<*> m .: "retries"
|
||||
|
||||
data LanguageConfig = LanguageConfig
|
||||
{ name :: Language
|
||||
, memory :: Maybe T.Text
|
||||
, cpus :: Maybe Double
|
||||
, timeout :: Maybe Int
|
||||
, concurrent :: Maybe Int
|
||||
, retries :: Maybe Int
|
||||
} deriving (Show)
|
||||
|
||||
instance FromYAML LanguageConfig where
|
||||
parseYAML = withMap "language" $ \m -> LanguageConfig
|
||||
<$> m .: "name"
|
||||
<*> m .:? "memory"
|
||||
<*> m .:? "cpus"
|
||||
<*> m .:? "timeout"
|
||||
<*> m .:? "concurrent"
|
||||
<*> m .:? "retries"
|
||||
data EvalResult
|
||||
= EvalOk BL.ByteString
|
||||
| EvalTimedOut
|
||||
| EvalErrored
|
||||
|
||||
newtype MyriadT m a = MyriadT { unMyriadT :: ReaderT Env (LoggingT m) a }
|
||||
deriving newtype
|
||||
|
@ -133,13 +82,6 @@ instance MonadBaseControl b m => MonadBaseControl b (MyriadT m) where
|
|||
liftBaseWith = defaultLiftBaseWith
|
||||
restoreM = defaultRestoreM
|
||||
|
||||
readConfig :: FilePath -> IO MyriadConfig
|
||||
readConfig f = do
|
||||
x <- BL.readFile f
|
||||
case decode1 x of
|
||||
Left (pos, e) -> error $ prettyPosWithSource pos x e
|
||||
Right y -> pure y
|
||||
|
||||
initEnv :: FilePath -> FilePath -> IO Env
|
||||
initEnv configPath languagesDir =
|
||||
Env
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue