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