Default field with notSerializedDefault flag set is a default field which will be serialized only if it's value differs from the default one. This flag can be set by using notSerializedDefaultField field type instead of defaultField field type.
This field is introduced in order to fix a bug of inconsistency between haskell and python config modules which leads to inconsistent config after ganeti updgrade. Signed-off-by: Oleg Ponomarev <[email protected]> --- src/Ganeti/THH.hs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Ganeti/THH.hs b/src/Ganeti/THH.hs index fd7857e..633d501 100644 --- a/src/Ganeti/THH.hs +++ b/src/Ganeti/THH.hs @@ -61,6 +61,7 @@ module Ganeti.THH ( declareSADT , andRestArguments , withDoc , defaultField + , notSerializeDefaultField , presentInForthcoming , optionalField , optionalNullSerField @@ -186,6 +187,9 @@ data Field = Field { fieldName :: String -- ^ a list of extra keys added by 'fieldShow' , fieldDefault :: Maybe (Q Exp) -- ^ an optional default value of type @t@ + , fieldSerializeDefault :: Bool + -- ^ whether not presented default value will be + -- serialized , fieldConstr :: Maybe String , fieldIsOptional :: OptionalType -- ^ determines if a field is optional, and if yes, @@ -203,6 +207,7 @@ simpleField fname ftype = , fieldShow = Nothing , fieldExtraKeys = [] , fieldDefault = Nothing + , fieldSerializeDefault = True , fieldConstr = Nothing , fieldIsOptional = NotOptional , fieldDoc = "" @@ -218,6 +223,7 @@ andRestArguments fname = , fieldShow = Nothing , fieldExtraKeys = [] , fieldDefault = Nothing + , fieldSerializeDefault = True , fieldConstr = Nothing , fieldIsOptional = AndRestArguments , fieldDoc = "" @@ -237,6 +243,13 @@ renameField constrName field = field { fieldConstr = Just constrName } defaultField :: Q Exp -> Field -> Field defaultField defval field = field { fieldDefault = Just defval } +-- | A defaultField which will be serialized only if it's value differs from +-- a default value. +notSerializeDefaultField :: Q Exp -> Field -> Field +notSerializeDefaultField defval field = + field { fieldDefault = Just defval + , fieldSerializeDefault = False } + -- | Mark a field as present in the forthcoming variant. presentInForthcoming :: Field -> Field presentInForthcoming field = field { fieldPresentInForthcoming = True } @@ -1236,7 +1249,14 @@ saveObjectField fvar field = do Nothing -> [( $nameE, JSON.JSNull )] Just v -> $(formatCode [| v |]) |] - NotOptional -> formatCode fvarE + NotOptional -> case (fieldDefault field, fieldSerializeDefault field) of + (Just v, False) -> [| if $v /= $fvarE + then $(formatCode fvarE) + else [] |] + -- If a default value exists and we shouldn't serialize + -- default fields - serialize only if the value differs + -- from the default one. + _ -> formatCode fvarE AndRestArguments -> [| M.toList $(varE fvar) |] where nameE = stringE (fieldName field) fvarE = varE fvar -- 2.6.0.rc2.230.g3dd15c0
