Revision a4f35477 src/Ganeti/JSON.hs

b/src/Ganeti/JSON.hs
39 39
  , asJSObject
40 40
  , asObjectList
41 41
  , tryFromObj
42
  , tryArrayMaybeFromObj
42 43
  , toArray
43 44
  , optionalJSField
44 45
  , optFieldsToObj
......
104 105
               -> m [J.JSObject J.JSValue]
105 106
loadJSArray s = fromJResult s . J.decodeStrict
106 107

  
108
-- | Helper function for missing-key errors
109
buildNoKeyError :: JSRecord -> String -> String
110
buildNoKeyError o k =
111
  printf "key '%s' not found, object contains only %s" k (show (map fst o))
112

  
107 113
-- | Reads the value of a key in a JSON object.
108 114
fromObj :: (J.JSON a, Monad m) => JSRecord -> String -> m a
109 115
fromObj o k =
110 116
  case lookup k o of
111
    Nothing -> fail $ printf "key '%s' not found, object contains only %s"
112
               k (show (map fst o))
117
    Nothing -> fail $ buildNoKeyError o k
113 118
    Just val -> fromKeyValue k val
114 119

  
115 120
-- | Reads the value of an optional key in a JSON object. Missing
......
136 141
                      JSRecord -> String -> a -> m a
137 142
fromObjWithDefault o k d = liftM (fromMaybe d) $ maybeFromObj o k
138 143

  
144
-- | Reads an array of optional items
145
arrayMaybeFromObj :: (J.JSON a, Monad m) =>
146
                     JSRecord -> String -> m [Maybe a]
147
arrayMaybeFromObj o k =
148
  case lookup k o of
149
    Just (J.JSArray xs) -> mapM parse xs
150
      where
151
        parse J.JSNull = return Nothing
152
        parse x = liftM Just $ fromJVal x
153
    _ -> fail $ buildNoKeyError o k
154

  
155
-- | Wrapper for arrayMaybeFromObj with better diagnostic
156
tryArrayMaybeFromObj :: (J.JSON a)
157
                     => String     -- ^ Textual "owner" in error messages
158
                     -> JSRecord   -- ^ The object array
159
                     -> String     -- ^ The desired key from the object
160
                     -> Result [Maybe a]
161
tryArrayMaybeFromObj t o = annotateResult t . arrayMaybeFromObj o
162

  
139 163
-- | Reads a JValue, that originated from an object key.
140 164
fromKeyValue :: (J.JSON a, Monad m)
141 165
              => String     -- ^ The key name

Also available in: Unified diff