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