{-# LANGUAGE TemplateHaskell #-}

{- |
  Module      :  Lighttpd.Conf.Instances.Lift
  Copyright   :  (c) Matt Morrow 2008
  License     :  BSD3

  Maintainer  :  Matt Morrow <mjm2002@gmail.com>
  Stability   :  unstable
  Portability :  non-portable (DeriveDataTypeable)
-}

module Lighttpd.Conf.Instances.Lift where

import Lighttpd.Conf.Syntax hiding (Name,mkName)
import qualified Lighttpd.Conf.Syntax as Syn
import qualified Data.ByteString.Char8 as BC8
import Language.Haskell.TH.Syntax hiding (Pat,Exp,Match,CondE)
import Language.Haskell.TH.Lib
import Data.PackedString


instance Lift BC8.ByteString where
  lift a = [|BC8.pack $(lift (BC8.unpack a))|]

instance Lift Syn.Name where
  lift (Syn.Name a) = [|Syn.Name a|]

instance Lift QName where
  lift (QName a b) = [|QName a b|]

instance Lift Config where
  lift (Config es) = [|Config es|]

instance Lift Val where
        -- produce an expression w/ will capture the
        -- haskell var of the same name as that which
        -- the bytestring in the SpliceV <here> refers
        -- to (i mean "refers to" in the obvious way).
        -- This variable must be of type (ToVal a) => a
        lift (SpliceV x) = [|toVal $(varE (mkName (BC8.unpack x)))|]

        lift (VarV x0)
          = appE
              (conE
                 (Name (packString "VarV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (StringV x0)
          = appE
              (conE
                 (Name (packString "StringV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (IntegerV x0)
          = appE
              (conE
                 (Name (packString "IntegerV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (BooleanV x0)
          = appE
              (conE
                 (Name (packString "BooleanV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (ArrayV x0)
          = appE
              (conE
                 (Name (packString "ArrayV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (ManyV x0)
          = appE
              (conE
                 (Name (packString "ManyV")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)

instance Lift ArrayElem where
        lift (ArrayElem x0 x1)
          = appE
              (appE
                 (conE
                    (Name (packString "ArrayElem")
                       (NameG DataName (packString "lighttpd-conf-0.4")
                          (packString "Lighttpd.Conf.Syntax"))))
                 (lift x0))
              (lift x1)

instance Lift Enabled where
        lift (Enable)
          = conE
              (Name (packString "Enable")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))
        lift (Disable)
          = conE
              (Name (packString "Disable")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))

instance Lift Exp where
        lift (CommentE x0)
          = appE
              (conE
                 (Name (packString "CommentE")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (GlobalCxtE x0)
          = appE
              (conE
                 (Name (packString "GlobalCxtE")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (OptionE x0 x1)
          = appE
              (appE
                 (conE
                    (Name (packString "OptionE")
                       (NameG DataName (packString "lighttpd-conf-0.4")
                          (packString "Lighttpd.Conf.Syntax"))))
                 (lift x0))
              (lift x1)
        lift (MergeE x0 x1)
          = appE
              (appE
                 (conE
                    (Name (packString "MergeE")
                       (NameG DataName (packString "lighttpd-conf-0.4")
                          (packString "Lighttpd.Conf.Syntax"))))
                 (lift x0))
              (lift x1)
        lift (IncludeE x0)
          = appE
              (conE
                 (Name (packString "IncludeE")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (CondE x0 x1 x2)
          = appE
              (appE
                 (appE
                    (conE
                       (Name (packString "CondE")
                          (NameG DataName (packString "lighttpd-conf-0.4")
                             (packString "Lighttpd.Conf.Syntax"))))
                    (lift x0))
                 (lift x1))
              (lift x2)

instance Lift CondElse where
        lift (CondElse x0 x1)
          = appE
              (appE
                 (conE
                    (Name (packString "CondElse")
                       (NameG DataName (packString "lighttpd-conf-0.4")
                          (packString "Lighttpd.Conf.Syntax"))))
                 (lift x0))
              (lift x1)

instance Lift Include where
        lift (ValueI x0)
          = appE
              (conE
                 (Name (packString "ValueI")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (ShellI x0)
          = appE
              (conE
                 (Name (packString "ShellI")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)

instance Lift Cond where
        lift (Cond x0 x1 x2)
          = appE
              (appE
                 (appE
                    (conE
                       (Name (packString "Cond")
                          (NameG DataName (packString "lighttpd-conf-0.4")
                             (packString "Lighttpd.Conf.Syntax"))))
                    (lift x0))
                 (lift x1))
              (lift x2)

instance Lift Op where
        lift (Equal)
          = conE
              (Name (packString "Equal")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))
        lift (NotEqual)
          = conE
              (Name (packString "NotEqual")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))
        lift (Match)
          = conE
              (Name (packString "Match")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))
        lift (NotMatch)
          = conE
              (Name (packString "NotMatch")
                 (NameG DataName (packString "lighttpd-conf-0.4")
                    (packString "Lighttpd.Conf.Syntax")))

instance Lift Pat where
        lift (StringP x0)
          = appE
              (conE
                 (Name (packString "StringP")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)
        lift (RegexP x0)
          = appE
              (conE
                 (Name (packString "RegexP")
                    (NameG DataName (packString "lighttpd-conf-0.4")
                       (packString "Lighttpd.Conf.Syntax"))))
              (lift x0)

instance Lift Field where
        lift (Field x0 x1)
          = appE
              (appE
                 (conE
                    (Name (packString "Field")
                       (NameG DataName (packString "lighttpd-conf-0.4")
                          (packString "Lighttpd.Conf.Syntax"))))
                 (lift x0))
              (lift x1)