module Network.DNS.Named.Zone ( ZoneFinder(..) , fromZones , Zone(..) , isInZone , zoneSOARecord , zoneNSRecord ) where import Data.Maybe import Network.DNS.Message import Network.DNS.DomainMap class ZoneFinder a where findZone :: a -> DomainName -> IO (Maybe Zone) instance ZoneFinder (DomainMap Zone) where findZone = (return .) . flip nearest instance ZoneFinder (IO (DomainMap Zone)) where findZone = flip (fmap . nearest) instance ZoneFinder (DomainName -> Maybe Zone) where findZone = (return .) instance ZoneFinder (DomainName -> IO (Maybe Zone)) where findZone = id fromZones :: [Zone] -> DomainMap Zone fromZones = fromList . map toPair where toPair z = (zoneName z, z) data Zone = Zone { zoneName :: !DomainName , zoneSOA :: !(Maybe SOAFields) , zoneRecordNames :: !(IO [DomainName]) , zoneResponder :: !(DomainName -> IO [SomeRR]) } isInZone :: DomainName -> Zone -> Bool isInZone name zone = zoneName zone `isZoneOf` name zoneSOARecord :: Zone -> Maybe SomeRR zoneSOARecord zone = do soa <- zoneSOA zone return $ wrapRecord $ ResourceRecord { rrName = zoneName zone , rrType = SOA , rrClass = IN , rrTTL = soaMinimumTTL soa , rrData = soa } zoneNSRecord :: Zone -> Maybe SomeRR zoneNSRecord zone = do soa <- zoneSOA zone return $ wrapRecord $ ResourceRecord { rrName = zoneName zone , rrType = NS , rrClass = IN , rrTTL = soaMinimumTTL soa , rrData = soaMasterNameServer soa }