{-# LANGUAGE RecordWildCards            #-}

module Data.KeyStore.KS.Configuration where

import           Data.KeyStore.Types
import qualified Data.Map               as Map
import           Data.Maybe
import           Text.KSRegex


configurationSettings :: Configuration -> Settings
configurationSettings :: Configuration -> Settings
configurationSettings = Configuration -> Settings
_cfg_settings

trigger :: Name -> Configuration -> Settings -> E Settings
trigger :: Name -> Configuration -> Settings -> E Settings
trigger Name
nm Configuration
cfg Settings
stgs0 =
    case Settings -> [SettingID]
checkSettingsCollisions Settings
stgs of
      []   -> Settings -> E Settings
forall a b. b -> Either a b
Right Settings
stgs
      [SettingID]
sids -> Reason -> E Settings
forall a b. a -> Either a b
Left (Reason -> E Settings) -> Reason -> E Settings
forall a b. (a -> b) -> a -> b
$ String -> Reason
forall a. Error a => String -> a
strMsg (String -> Reason) -> String -> Reason
forall a b. (a -> b) -> a -> b
$ String
"settings collided in triggers: "
                                String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nm_s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Text] -> String
forall a. Show a => a -> String
show((SettingID -> Text) -> [SettingID] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map SettingID -> Text
_SettingID [SettingID]
sids)
                                String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Settings] -> String
forall a. Show a => a -> String
show (Settings
stgs0 Settings -> [Settings] -> [Settings]
forall a. a -> [a] -> [a]
: [Settings]
t_stgss)
  where
    stgs :: Settings
stgs     = [Settings] -> Settings
forall a. Monoid a => [a] -> a
mconcat ([Settings] -> Settings) -> [Settings] -> Settings
forall a b. (a -> b) -> a -> b
$ Settings
stgs0 Settings -> [Settings] -> [Settings]
forall a. a -> [a] -> [a]
: [Settings]
t_stgss

    t_stgss :: [Settings]
t_stgss  = [ Settings
_trg_settings | Trigger{Settings
Pattern
TriggerID
_trg_settings :: Trigger -> Settings
_trg_pattern :: Trigger -> Pattern
_trg_id :: Trigger -> TriggerID
_trg_pattern :: Pattern
_trg_id :: TriggerID
_trg_settings :: Settings
..}<-Map TriggerID Trigger -> [Trigger]
forall k a. Map k a -> [a]
Map.elems (Map TriggerID Trigger -> [Trigger])
-> Map TriggerID Trigger -> [Trigger]
forall a b. (a -> b) -> a -> b
$ Configuration -> Map TriggerID Trigger
_cfg_triggers Configuration
cfg,
                                                            Pattern -> Bool
mtch Pattern
_trg_pattern ]

    mtch :: Pattern -> Bool
mtch Pattern
pat = Maybe [String] -> Bool
forall a. Maybe a -> Bool
isJust (Maybe [String] -> Bool) -> Maybe [String] -> Bool
forall a b. (a -> b) -> a -> b
$ Regex -> String -> Maybe [String]
matchRegex (Pattern -> Regex
_pat_regex Pattern
pat) String
nm_s

    nm_s :: String
nm_s     = Name -> String
_name Name
nm