module Resolve.DNS.Helper.DNS where

import Network.Socket

import Resolve.Types
import Resolve.DNS.Types
import qualified Resolve.DNS.Channel as C

import qualified Resolve.DNS.Helper.UDP as UDP
import qualified Resolve.DNS.Helper.LiveTCP as TCP

import qualified Resolve.DNS.Truncation as T

import Control.Exception


data Config = Config { host :: HostName
                     , port :: ServiceName
                     }

new :: Config -> IO (Resolver Message Message)
new c = do
  bracketOnError
    (do
        u <- UDP.new $ UDP.Config {UDP.host = host c, UDP.port = port c}
        t <- TCP.new $ TCP.Config {TCP.host = host c, TCP.port = port c}
        return $ Resolver { resolve = T.truncation $ T.Config {T.udp = resolve u, T.tcp = resolve t}
                          , delete = do
                              delete u
                              delete t
                          }
    )
    (\r -> delete r)
    return