]> www.average.org Git - pdns-pipe-nmc.git/blob - NmcJson.hs
wip JsonRpc response instances
[pdns-pipe-nmc.git] / NmcJson.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 module NmcJson  ( NmcRes(..)
4                 , NmcDom
5                 ) where
6
7 import Data.ByteString.Lazy (ByteString)
8 import Data.Map (Map)
9 import Control.Applicative ((<$>), (<*>), empty)
10 import Data.Aeson
11
12 data NmcRRService = NmcRRService -- unused
13                         { srvName       :: String
14                         , srvProto      :: String
15                         , srvW1         :: Int
16                         , srvW2         :: Int
17                         , srvPort       :: Int
18                         , srvHost       :: [String]
19                         } deriving (Show)
20
21 instance FromJSON NmcRRService where
22         parseJSON (Object o) = NmcRRService
23                 <$> o .: "name"
24                 <*> o .: "proto"
25                 <*> o .: "w1"
26                 <*> o .: "w2"
27                 <*> o .: "port"
28                 <*> o .: "host"
29         parseJSON _ = empty
30
31 data NmcRRI2p = NmcRRI2p -- unused
32                         { i2pDestination :: String
33                         , i2pName        :: String
34                         , i2pB32         :: String
35                         } deriving (Show)
36
37 instance FromJSON NmcRRI2p where
38         parseJSON (Object o) = NmcRRI2p
39                 <$> o .: "destination"
40                 <*> o .: "name"
41                 <*> o .: "b32"
42         parseJSON _ = empty
43
44 data NmcDom = NmcDom    { domService     :: Maybe [[String]] -- [NmcRRService]
45                         , domIp          :: Maybe [String]
46                         , domIp6         :: Maybe [String]
47                         , domTor         :: Maybe String
48                         , domI2p         :: Maybe NmcRRI2p
49                         , domFreenet     :: Maybe String
50                         , domAlias       :: Maybe String
51                         , domTranslate   :: Maybe String
52                         , domEmail       :: Maybe String
53                         , domLoc         :: Maybe String
54                         , domInfo        :: Maybe Value
55                         , domNs          :: Maybe [String]
56                         , domDelegate    :: Maybe [String]
57                         , domImport      :: Maybe [[String]]
58                         , domMap         :: Maybe (Map String NmcDom)
59                         , domFingerprint :: Maybe [String]
60                         , domTls         :: Maybe (Map String
61                                                     (Map String [[String]]))
62                         , domDs          :: Maybe [[String]]
63                         } deriving (Show)
64
65 instance FromJSON NmcDom where
66         parseJSON (Object o) = NmcDom
67                 <$> o .:? "service"
68                 <*> o .:? "ip"
69                 <*> o .:? "ip6"
70                 <*> o .:? "tor"
71                 <*> o .:? "i2p"
72                 <*> o .:? "freenet"
73                 <*> o .:? "alias"
74                 <*> o .:? "translate"
75                 <*> o .:? "email"
76                 <*> o .:? "loc"
77                 <*> o .:? "info"
78                 <*> o .:? "ns"
79                 <*> o .:? "delegate"
80                 <*> o .:? "import"
81                 <*> o .:? "map"
82                 <*> o .:? "fingerprint"
83                 <*> o .:? "tls"
84                 <*> o .:? "ds"
85         parseJSON _ = empty
86
87 data NmcRes = NmcRes    { resName       :: String
88                         , resValue      :: ByteString -- NmcDom
89                         , resTxid       :: String
90                         , resAddress    :: String
91                         , resExpires_in :: Int
92                         } deriving (Show)
93 instance FromJSON NmcRes where
94         parseJSON (Object o) = NmcRes
95                 <$> o .: "name"
96                 <*> o .: "value"
97                 <*> o .: "txid"
98                 <*> o .: "address"
99                 <*> o .: "expires_in"
100         parseJSON _ = empty
101
102 main = do
103   let l = "{\"name\":\"d/dot-bit\",\"value\":\"{\\\"info\\\":{\\\"description\\\":\\\"Dot-BIT Project - Official Website\\\",\\\"registrar\\\":\\\"http://register.dot-bit.org\\\"},\\\"fingerprint\\\":[\\\"30:B0:60:94:32:08:EC:F5:BE:DF:F4:BB:EE:52:90:2C:5D:47:62:46\\\"],\\\"ns\\\":[\\\"ns0.web-sweet-web.net\\\",\\\"ns1.web-sweet-web.net\\\"],\\\"map\\\":{\\\"\\\":{\\\"ns\\\":[\\\"ns0.web-sweet-web.net\\\",\\\"ns1.web-sweet-web.net\\\"]}},\\\"email\\\":\\\"register@dot-bit.org\\\"}\",\"txid\":\"7412603f2e6c3459be56accc6e1f3646b603f3d4a4188119a4072f125c1340d5\",\"address\":\"Mw3KCQcqC44nm75w7r79ZifZbEqT8RetWn\",\"expires_in\":18915}"
104   let r = decode l :: Maybe NmcRes
105   case r of
106     Just resp -> do
107       let value = (resValue resp)
108       let dom = decode value :: Maybe NmcDom
109       print dom
110     Nothing   ->
111       print "Unparseable NMC response"