{-# LANGUAGE OverloadedStrings #-}
module Keter.SSL
    ( TLSConfig (..)
    , TLSConfigNoDir
    , setDir
    , runTCPServerTLS
    ) where

import Prelude hiding (FilePath)
import Data.Yaml (FromJSON (parseJSON), (.:), (.:?), (.!=), Value (Object))
import Control.Applicative ((<$>), (<*>))
import Control.Monad (mzero)
import Data.String (fromString)
import Filesystem.Path.CurrentOS ((</>), FilePath)
import Data.Conduit.Network.TLS

setDir :: FilePath -> TLSConfigNoDir -> TLSConfig
setDir dir (TLSConfigNoDir tls) = tls
    { tlsCertificate = dir </> tlsCertificate tls
    , tlsKey = dir </> tlsKey tls
    }

newtype TLSConfigNoDir = TLSConfigNoDir TLSConfig

instance FromJSON TLSConfigNoDir where
    parseJSON (Object o) = fmap TLSConfigNoDir $ tlsConfig
        <$> (fmap fromString <$> o .:? "host") .!= "*"
        <*> o .:? "port" .!= 443
        <*> (fromString <$> o .: "certificate")
        <*> (fromString <$> o .: "key")
    parseJSON _ = mzero