{-# LANGUAGE OverloadedStrings #-}

module Text.Glabrous.Types where

import           Data.Aeson
import qualified Data.HashMap.Strict as H
import qualified Data.Text           as T

data Token = Tag !T.Text | Literal !T.Text deriving (Show,Eq)

data Template = Template { content :: ![Token] } deriving (Show,Eq)

data Context = Context { variables :: H.HashMap T.Text T.Text } deriving (Show,Eq)

instance ToJSON Context where
    toJSON (Context h) = object $ (\(k,v) -> (k,String v)) <$> H.toList h

instance FromJSON Context where
    parseJSON (Object o) = return
        Context { variables =
                      H.fromList $ (\(k,String v) -> (k,v)) <$> H.toList o
                }
    parseJSON _          = fail "expected an object"

type Tag = T.Text

data Result = Final !T.Text | Partial { template :: !Template, tags :: ![Tag]}  deriving (Show,Eq)