--- | SRV case - remove everyting and filter SRV records
-normalizeSrv :: String -> String -> NmcDom -> NmcDom
-normalizeSrv serv proto dom =
- emptyNmcDom {domService = fmap (filter needed) (domService dom)}
- where
- needed r = srvName r == serv && srvProto r == proto
+-- | transfer some elements of `base` into `sub`, notably TLSA
+propagate :: NmcDom -> NmcDom -> NmcDom
+propagate base sub = sub `merge` (pickglobals base)
+ where
+ pickglobals dom = fromMaybe def (siftsubmap (siftsubmap taketlsa) dom)
+ siftsubmap f dom =
+ let
+ sdmap = fromMaybe empty (domSubmap dom)
+ sdmap' = foldrWithKey (\k x -> addifjust k (f x)) empty sdmap
+ addifjust k mdom acc = case mdom of
+ Nothing -> acc
+ Just dom -> insert k dom acc -- dups are impossible here
+ in
+ if null sdmap' then Nothing else Just $ def { domSubmap = Just sdmap'}
+ taketlsa dom = case domTlsa dom of
+ Nothing -> Nothing
+ Just tlsa -> case filter (\x -> tlsIncSubdoms x) tlsa of
+ [] -> Nothing
+ tlsa' -> Just $ def { domTlsa = Just tlsa' }