{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Web.Apiary.TH.Internal where

import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Control.Monad.Apiary.Filter.Capture hiding(capture, capture')
import qualified Control.Monad.Apiary.Filter.Capture as Capture
import Data.Apiary.SList
import qualified Data.Text as T

preCap :: String -> [String]
preCap ""  = []
preCap "/" = []
preCap ('/':p) = splitPath p
preCap p       = splitPath p

splitPath :: String -> [String]
splitPath = map T.unpack . T.splitOn "/" . T.pack

mkCap :: [String] -> ExpQ
mkCap [] = [|SNil|]
mkCap ((':':tyStr):as) = do
    -- ty <- lookupTypeName tyStr >>= maybe (fail "") return
    let ty = mkName tyStr
    [|(Fetch :: Fetch $(conT ty)) ::: $(mkCap as) |]
mkCap (eq:as) = do
    [|(Equal $(stringE eq)) ::: $(mkCap as) |]

applyCapture :: ExpQ -> ExpQ
applyCapture e = [|Capture.capture $e|]

capture :: QuasiQuoter
capture = QuasiQuoter 
    { quoteExp = applyCapture . mkCap . preCap
    , quotePat  = \_ -> error "No quotePat."
    , quoteType = \_ -> error "No quoteType."
    , quoteDec  = \_ -> error "No quoteDec."
    }