summaryrefslogtreecommitdiff
path: root/Types/MetaData.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Types/MetaData.hs')
-rw-r--r--Types/MetaData.hs7
1 files changed, 6 insertions, 1 deletions
diff --git a/Types/MetaData.hs b/Types/MetaData.hs
index 6f8a300b2..c37b31c51 100644
--- a/Types/MetaData.hs
+++ b/Types/MetaData.hs
@@ -219,6 +219,7 @@ data ModMeta
= AddMeta MetaField MetaValue
| DelMeta MetaField MetaValue
| SetMeta MetaField MetaValue -- removes any existing values
+ | MaybeSetMeta MetaField MetaValue -- when field has no existing value
{- Applies a ModMeta, generating the new MetaData.
- Note that the new MetaData does not include all the
@@ -229,12 +230,16 @@ modMeta _ (DelMeta f oldv) = updateMetaData f (unsetMetaValue oldv) emptyMetaDat
modMeta m (SetMeta f v) = updateMetaData f v $
foldr (updateMetaData f) emptyMetaData $
map unsetMetaValue $ S.toList $ currentMetaDataValues f m
+modMeta m (MaybeSetMeta f v)
+ | S.null (currentMetaDataValues f m) = updateMetaData f v emptyMetaData
+ | otherwise = emptyMetaData
-{- Parses field=value, field+=value, field-=value -}
+{- Parses field=value, field+=value, field-=value, field?=value -}
parseModMeta :: String -> Either String ModMeta
parseModMeta p = case lastMaybe f of
Just '+' -> AddMeta <$> mkMetaField f' <*> v
Just '-' -> DelMeta <$> mkMetaField f' <*> v
+ Just '?' -> MaybeSetMeta <$> mkMetaField f' <*> v
_ -> SetMeta <$> mkMetaField f <*> v
where
(f, sv) = separate (== '=') p