Revision eb577716 src/Ganeti/THH.hs
b/src/Ganeti/THH.hs | ||
---|---|---|
68 | 68 |
, excErrMsg |
69 | 69 |
) where |
70 | 70 |
|
71 |
import Control.Arrow ((&&&)) |
|
71 | 72 |
import Control.Applicative |
72 | 73 |
import Control.Monad |
73 | 74 |
import Data.Char |
... | ... | |
910 | 911 |
-- various types of fields that we have. |
911 | 912 |
saveObjectField :: Name -> Field -> Q Exp |
912 | 913 |
saveObjectField fvar field = |
913 |
case fieldIsOptional field of
|
|
914 |
OptionalOmitNull -> [| case $(varE fvar) of
|
|
915 |
Nothing -> []
|
|
916 |
Just v -> [( $nameE, JSON.showJSON v )]
|
|
917 |
|]
|
|
918 |
OptionalSerializeNull -> [| case $(varE fvar) of
|
|
919 |
Nothing -> [( $nameE, JSON.JSNull )]
|
|
920 |
Just v -> [( $nameE, JSON.showJSON v )]
|
|
914 |
let formatFn = fromMaybe [| JSON.showJSON &&& (const []) |] $
|
|
915 |
fieldShow field
|
|
916 |
formatCode v = [| let (actual, extra) = $formatFn $(v)
|
|
917 |
in ($nameE, actual) : extra |]
|
|
918 |
in case fieldIsOptional field of
|
|
919 |
OptionalOmitNull -> [| case $(fvarE) of
|
|
920 |
Nothing -> []
|
|
921 |
Just v -> $(formatCode [| v |])
|
|
921 | 922 |
|] |
922 |
NotOptional -> |
|
923 |
case fieldShow field of |
|
924 |
-- Note: the order of actual:extra is important, since for |
|
925 |
-- some serialisation types (e.g. Luxi), we use tuples |
|
926 |
-- (positional info) rather than object (name info) |
|
927 |
Nothing -> [| [( $nameE, JSON.showJSON $fvarE)] |] |
|
928 |
Just fn -> [| let (actual, extra) = $fn $fvarE |
|
929 |
in ($nameE, JSON.showJSON actual):extra |
|
930 |
|] |
|
923 |
OptionalSerializeNull -> [| case $(fvarE) of |
|
924 |
Nothing -> [( $nameE, JSON.JSNull )] |
|
925 |
Just v -> $(formatCode [| v |]) |
|
926 |
|] |
|
927 |
NotOptional -> formatCode fvarE |
|
931 | 928 |
where nameE = stringE (fieldName field) |
932 | 929 |
fvarE = varE fvar |
933 | 930 |
|
Also available in: Unified diff