Revision 44c15fa3 src/Ganeti/Types.hs

b/src/Ganeti/Types.hs
40 40
  , DiskTemplate(..)
41 41
  , diskTemplateToRaw
42 42
  , diskTemplateFromRaw
43
  , TagKind(..)
44
  , tagKindToRaw
45
  , tagKindFromRaw
43 46
  , NonNegative
44 47
  , fromNonNegative
45 48
  , mkNonNegative
......
53 56
  , fromNonEmpty
54 57
  , mkNonEmpty
55 58
  , NonEmptyString
59
  , QueryResultCode
60
  , IPv4Address
61
  , mkIPv4Address
62
  , IPv4Network
63
  , mkIPv4Network
64
  , IPv6Address
65
  , mkIPv6Address
66
  , IPv6Network
67
  , mkIPv6Network
56 68
  , MigrationMode(..)
57 69
  , VerifyOptionalChecks(..)
70
  , verifyOptionalChecksToRaw
58 71
  , DdmSimple(..)
59 72
  , DdmFull(..)
60 73
  , CVErrorCode(..)
......
166 179
mkNonEmpty [] = fail "Received empty value for non-empty list"
167 180
mkNonEmpty xs = return (NonEmpty xs)
168 181

  
182
instance (Eq a, Ord a) => Ord (NonEmpty a) where
183
  NonEmpty { fromNonEmpty = x1 } `compare` NonEmpty { fromNonEmpty = x2 } =
184
    x1 `compare` x2
185

  
169 186
instance (JSON.JSON a) => JSON.JSON (NonEmpty a) where
170 187
  showJSON = JSON.showJSON . fromNonEmpty
171 188
  readJSON v = JSON.readJSON v >>= mkNonEmpty
......
173 190
-- | A simple type alias for non-empty strings.
174 191
type NonEmptyString = NonEmpty Char
175 192

  
193
type QueryResultCode = Int
194

  
195
newtype IPv4Address = IPv4Address { fromIPv4Address :: String }
196
  deriving (Show, Eq)
197

  
198
-- FIXME: this should check that 'address' is a valid ip
199
mkIPv4Address :: Monad m => String -> m IPv4Address
200
mkIPv4Address address =
201
  return IPv4Address { fromIPv4Address = address }
202

  
203
instance JSON.JSON IPv4Address where
204
  showJSON = JSON.showJSON . fromIPv4Address
205
  readJSON v = JSON.readJSON v >>= mkIPv4Address
206

  
207
newtype IPv4Network = IPv4Network { fromIPv4Network :: String }
208
  deriving (Show, Eq)
209

  
210
-- FIXME: this should check that 'address' is a valid ip
211
mkIPv4Network :: Monad m => String -> m IPv4Network
212
mkIPv4Network address =
213
  return IPv4Network { fromIPv4Network = address }
214

  
215
instance JSON.JSON IPv4Network where
216
  showJSON = JSON.showJSON . fromIPv4Network
217
  readJSON v = JSON.readJSON v >>= mkIPv4Network
218

  
219
newtype IPv6Address = IPv6Address { fromIPv6Address :: String }
220
  deriving (Show, Eq)
221

  
222
-- FIXME: this should check that 'address' is a valid ip
223
mkIPv6Address :: Monad m => String -> m IPv6Address
224
mkIPv6Address address =
225
  return IPv6Address { fromIPv6Address = address }
226

  
227
instance JSON.JSON IPv6Address where
228
  showJSON = JSON.showJSON . fromIPv6Address
229
  readJSON v = JSON.readJSON v >>= mkIPv6Address
230

  
231
newtype IPv6Network = IPv6Network { fromIPv6Network :: String }
232
  deriving (Show, Eq)
233

  
234
-- FIXME: this should check that 'address' is a valid ip
235
mkIPv6Network :: Monad m => String -> m IPv6Network
236
mkIPv6Network address =
237
  return IPv6Network { fromIPv6Network = address }
238

  
239
instance JSON.JSON IPv6Network where
240
  showJSON = JSON.showJSON . fromIPv6Network
241
  readJSON v = JSON.readJSON v >>= mkIPv6Network
242

  
176 243
-- * Ganeti types
177 244

  
178 245
-- | Instance disk template type.
......
192 259
  fromStringRepr = diskTemplateFromRaw
193 260
  toStringRepr = diskTemplateToRaw
194 261

  
262
-- | Data type representing what items the tag operations apply to.
263
$(THH.declareSADT "TagKind"
264
  [ ("TagKindInstance", 'C.tagInstance)
265
  , ("TagKindNode",     'C.tagNode)
266
  , ("TagKindGroup",    'C.tagNodegroup)
267
  , ("TagKindCluster",  'C.tagCluster)
268
  ])
269
$(THH.makeJSONInstance ''TagKind)
270

  
195 271
-- | The Group allocation policy type.
196 272
--
197 273
-- Note that the order of constructors is important as the automatic

Also available in: Unified diff