module Data.Component.Resolver (
resolver,
foldResult,
) where
import qualified Data.Aeson as Aeson
import qualified Data.Text as T
import MiniLight
import qualified Data.Component.AnimationLayer as AnimationLayer
import qualified Data.Component.Button as Button
import qualified Data.Component.Layer as Layer
import qualified Data.Component.MessageEngine as MessageEngine
import qualified Data.Component.MessageLayer as MessageLayer
foldResult :: (String -> b) -> (a -> b) -> Aeson.Result a -> b
foldResult f g r = case r of
Aeson.Error err -> f err
Aeson.Success a -> g a
resolver :: Resolver
resolver name props = case name of
"animation-layer" -> newComponent
=<< AnimationLayer.new (foldResult error id $ Aeson.fromJSON props)
"button" ->
newComponent =<< Button.new (foldResult error id $ Aeson.fromJSON props)
"layer" ->
newComponent =<< Layer.new (foldResult error id $ Aeson.fromJSON props)
"message-engine" -> newComponent
=<< MessageEngine.new (foldResult error id $ Aeson.fromJSON props)
"message-layer" -> newComponent
=<< MessageLayer.new (foldResult error id $ Aeson.fromJSON props)
"tiled-layer" -> newComponent
=<< Layer.newNineTile (foldResult error id $ Aeson.fromJSON props)
_ -> error $ T.unpack $ "Component not defined: `" <> name <> "`"