]> www.average.org Git - pdns-pipe-nmc.git/blobdiff - NmcJson.hs
hack to handle ip-only value for the domain
[pdns-pipe-nmc.git] / NmcJson.hs
index eb1bdb49fb7967544221b09dc55c390af3d7de3f..14a2f6322d39d913a20a67be222e955b0faad7e5 100644 (file)
@@ -7,6 +7,7 @@ module NmcJson  ( NmcRes(..)
                 ) where
 
 import Data.ByteString.Lazy (ByteString)
+import Data.Text as T (unpack)
 import Data.Map as M (Map, lookup)
 import Control.Applicative ((<$>), (<*>), empty)
 import Data.Aeson
@@ -65,6 +66,9 @@ data NmcDom = NmcDom    { domService     :: Maybe [[String]] -- [NmcRRService]
                         } deriving (Show, Eq)
 
 instance FromJSON NmcDom where
+        -- Some just put the IP address in the value, especially in the map.
+        -- As an ugly hack, try to interpret string as IP (v4) address.
+        parseJSON (String s) = return emptyNmcDom { domIp = Just [T.unpack s] }
         parseJSON (Object o) = NmcDom
                 <$> o .:? "service"
                 <*> o .:? "ip"
@@ -135,26 +139,26 @@ descendNmc subdom rawdom =
 
 -- FIXME -- I hope there exists a better way to merge records!
 mergeNmc :: NmcDom -> NmcDom -> NmcDom
-mergeNmc sub dom = dom  { domService = choose dom domService sub
-                        , domIp = choose dom domIp sub
-                        , domIp6 = choose dom domIp6 sub
-                        , domTor = choose dom domTor sub
-                        , domI2p = choose dom domI2p sub
-                        , domFreenet = choose dom domFreenet sub
-                        , domAlias = choose dom domAlias sub
-                        , domTranslate = choose dom domTranslate sub
-                        , domEmail = choose dom domEmail sub
-                        , domLoc = choose dom domLoc sub
-                        , domInfo = choose dom domInfo sub
-                        , domNs = choose dom domNs sub
-                        , domDelegate = choose dom domDelegate sub
-                        , domImport = choose dom domImport sub
-                        , domFingerprint = choose dom domFingerprint sub
-                        , domTls = choose dom domTls sub
-                        , domDs = choose dom domDs sub
+mergeNmc sub dom = dom  { domService = choose domService
+                        , domIp =          choose domIp
+                        , domIp6 =         choose domIp6
+                        , domTor =         choose domTor
+                        , domI2p =         choose domI2p
+                        , domFreenet =     choose domFreenet
+                        , domAlias =       choose domAlias
+                        , domTranslate =   choose domTranslate
+                        , domEmail =       choose domEmail
+                        , domLoc =         choose domLoc
+                        , domInfo =        choose domInfo
+                        , domNs =          choose domNs
+                        , domDelegate =    choose domDelegate
+                        , domImport =      choose domImport
+                        , domFingerprint = choose domFingerprint
+                        , domTls =         choose domTls
+                        , domDs =          choose domDs
                         }
   where
-    choose :: NmcDom -> (NmcDom -> Maybe a) -> NmcDom -> Maybe a
-    choose sub t dom = case t dom of
-      Nothing -> t sub
+    choose :: (NmcDom -> Maybe a) -> Maybe a
+    choose field = case field dom of
+      Nothing -> field sub
       Just x  -> Just x