module Conferer.Source.PropertiesFile where import Data.Text (Text) import Data.Function ((&)) import System.Directory (doesFileExist) import Data.Maybe (catMaybes) import qualified Data.Text as Text import qualified Data.Text.IO as Text import Conferer.Types import Conferer.Source.Files import Conferer.Source.Null import Conferer.Source.Simple -- | 'SourceCreator' for properties file 'Source' that read from a -- config file in @config/{env}.properties@ and parses it as a properties -- file with @some.key=a value@ lines mkPropertiesFileSource :: SourceCreator mkPropertiesFileSource = \config -> do filePath <- getFilePathFromEnv config "properties" fileExists <- doesFileExist filePath if fileExists then do fileContent <- Text.readFile filePath mkPropertiesFileSource' fileContent config else do mkNullSource config -- | 'SourceCreator' for properties file 'Source' that only parses a -- given 'Text' as a properties file mkPropertiesFileSource' :: Text -> SourceCreator mkPropertiesFileSource' fileContent = \config -> do let keyValues = fileContent & Text.lines & fmap lineToKeyValue & catMaybes mkMapSource keyValues config -- | Transform a line into a key/value pair (or not) lineToKeyValue :: Text -> Maybe (Key, Text) lineToKeyValue line = Text.breakOn "=" line & (\(rawKey, rawValue) -> case Text.stripPrefix "=" rawValue of Just value -> Just (Path $ Text.splitOn "." rawKey, value) Nothing -> Nothing )