@@ -1,13 +1,14 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Validate (module') where
2module Validate (module') where
4−import Control.Monad (foldM)
4+import Control.Monad (foldM, when)
5import qualified Data.Map as Map
5import qualified Data.Map as Map
6import qualified Data.Set as Set
6import qualified Data.Set as Set
7import qualified Data.Foldable as F
7import qualified Data.Foldable as F
8import qualified Data.Traversable as T
8import qualified Data.Traversable as T
10import AST.Expression.General as Expr
10import AST.Expression.General as Expr
11+import qualified AST.Effects as Fx
11import qualified AST.Expression.Source as Source
12import qualified AST.Expression.Source as Source
12import qualified AST.Expression.Valid as Valid
13import qualified AST.Expression.Valid as Valid
13import qualified AST.Declaration as D
14import qualified AST.Declaration as D
@@ -61,19 +62,28 @@ addDefaults pkgName imports =
61validateModuleDecl
62validateModuleDecl
62 :: Module.SourceTag
63 :: Module.SourceTag
63 -> Module.SourceSettings
64 -> Module.SourceSettings
64− -> Result.Result wrn Error.Error Module.ValidEffects
65+ -> Result.Result wrn Error.Error Fx.Effects
65−validateModuleDecl tag settings =
66+validateModuleDecl tag settings@(A.A _ pairs) =
66 case tag of
67 case tag of
67− Module.SrcNormal ->
68+ Module.Normal ->
68 do noSettings Error.SettingsOnNormalModule settings
69 do noSettings Error.SettingsOnNormalModule settings
69− return Module.ValidNormal
70+ return Fx.None
71− Module.SrcForeign ->
72+ Module.Foreign _ ->
72 do noSettings Error.SettingsOnForeignModule settings
73 do noSettings Error.SettingsOnForeignModule settings
73− return Module.ValidForeign
74+ return Fx.Foreign
75− Module.SrcEffect ->
76+ Module.Effect tagRegion ->
76− gatherEffectSettings settings
77+ let
78+ collectSettings (A.A region setting, userValue) dict =
79+ Map.insertWith (++) setting [(region, userValue)] dict
82+ foldr collectSettings Map.empty pairs
84+ do managerType <- toManagerType tagRegion settingsDict
86+ Fx.Info tagRegion (error "TODO") (error "TODO") (error "TODO") managerType
@@ -89,47 +99,59 @@ noSettings errorMsg (A.A region settings) =
89 Result.throw region errorMsg
99 Result.throw region errorMsg
92−gatherEffectSettings
102+toManagerType
93− :: Module.SourceSettings
103+ :: R.Region
104+ -> Map.Map String [(R.Region, A.Located String)]
94− -> Result.Result wrn Error.Error Module.ValidEffects
105+ -> Result.Result wrn Error.Error Fx.ManagerType
95−gatherEffectSettings (A.A _ pairs) =
106+toManagerType tagRegion settingsDict =
96− uncurry Module.ValidEffect <$>
107+ let
97− gatherEffectSettingsHelp (Nothing, Nothing) pairs
108+ toErrors name entries =
109+ map (\entry -> A.A (fst entry) (Error.BadSettingOnEffectModule name)) entries
113+ |> Map.delete "command"
114+ |> Map.delete "subscription"
115+ |> Map.mapWithKey toErrors
119+ do when (not (null errors)) (Result.throwMany errors)
121+ (,) <$> extractOne "command" settingsDict
122+ <*> extractOne "subscription" settingsDict
124+ case maybeEffects of
125+ (Nothing, Nothing) ->
126+ Result.throw tagRegion Error.NoSettingsOnEffectModule
100−type Effects =
128+ (Just cmd, Nothing) ->
101− (Maybe (A.Located String), Maybe (A.Located String))
129+ return (Fx.CmdManager cmd)
131+ (Nothing, Just sub) ->
132+ return (Fx.SubManager sub)
104−gatherEffectSettingsHelp
134+ (Just cmd, Just sub) ->
105− :: Effects
135+ return (Fx.FxManager cmd sub)
106− -> [(A.Located String, A.Located String)]
107− -> Result.Result wrn Error.Error Effects
108−gatherEffectSettingsHelp effects@(maybeCmd, maybeSub) pairs =
113− (A.A region name, effect) : rest ->
118− gatherEffectSettingsHelp (Just effect, maybeSub) rest
120− Just _ ->
138+extractOne
121− Result.throw region (Error.DuplicateSettingOnEffectModule name)
139+ :: String
140+ -> Map.Map String [(R.Region, A.Located String)]
141+ -> Result.Result w Error.Error (Maybe (A.Located String))
142+extractOne name settingsDict =
143+ case Map.lookup name settingsDict of
123− "subscription" ->
147+ Just [] ->
124− case maybeSub of
148+ error "Empty lists should never be added to the dictionary of effect module settings."
126− gatherEffectSettingsHelp (maybeCmd, Just effect) rest
128− Just _ ->
150+ Just [(_, userType)] ->
129− Result.throw region (Error.DuplicateSettingOnEffectModule name)
151+ return (Just userType)
131− _ ->
153+ Just ((region, _) : _) ->
132− Result.throw region (Error.BadSettingOnEffectModule name)
154+ Result.throw region (Error.DuplicateSettingOnEffectModule name)
@@ -407,6 +429,9 @@ expression (A.A ann sourceExpression) =
407 Sub moduleName typeName ->
429 Sub moduleName typeName ->
408 return (Sub moduleName typeName)
430 return (Sub moduleName typeName)
432+ SaveEnv moduleName effects ->
433+ return (SaveEnv moduleName effects)
410 GLShader uid src gltipe ->
435 GLShader uid src gltipe ->
411 return (GLShader uid src gltipe)
436 return (GLShader uid src gltipe)