store-0.4.3.1: Fast binary serialization

Safe Haskell | None
Language | Haskell2010

Data.Store.Version

Description

This module provides utilities which help ensure that we aren't attempting to de-serialize data that is an older or newer version. The `WithVersion` utility wraps up a datatype along with a version tag. This version tag can either be provided by the user (`namedVersionConfig`), or use a computed hash (`hashedVersionConfig`).

The magic here is using an SYB traversal (`Data`) to get the structure of all the data-types involved. This info is rendered to text and hashed to yield a hash which describes it.

NOTE that this API is still quite new and so is likely to break compatibility in the future. It should also be expected that the computed hashes may change between major version bumps, though this will be minimized when directly feasible.

Synopsis

- newtype StoreVersion = StoreVersion {
  - unStoreVersion :: ByteString
  }
- data VersionConfig a = VersionConfig {
  - vcExpectedHash :: Maybe String
  - vcManualName :: Maybe String
  - vcIgnore :: Set String
  - vcRenames :: Map String String
  }
- hashedVersionConfig :: String -> VersionConfig a
- namedVersionConfig :: String -> String -> VersionConfig a
- encodeWithVersionQ :: Data a => VersionConfig a -> Q Exp
- decodeWithVersionQ :: Data a => VersionConfig a -> Q Exp

# Documentation

newtype StoreVersion #

Constructors

StoreVersion |
Fields unStoreVersion :: ByteString

Instances

Eq StoreVersion # |
Methods (==) :: StoreVersion -> StoreVersion -> Bool # (/=) :: StoreVersion -> StoreVersion -> Bool #
Data StoreVersion # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> StoreVersion -> c StoreVersion # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c StoreVersion # toConstr :: StoreVersion -> Constr # dataTypeOf :: StoreVersion -> DataType # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c StoreVersion) # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c StoreVersion) # gmapT :: (forall b. Data b => b -> b) -> StoreVersion -> StoreVersion # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> StoreVersion -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> StoreVersion -> r # gmapQ :: (forall d. Data d => d -> u) -> StoreVersion -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> StoreVersion -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> StoreVersion -> m StoreVersion # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> StoreVersion -> m StoreVersion # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> StoreVersion -> m StoreVersion #
Ord StoreVersion # |
Methods compare :: StoreVersion -> StoreVersion -> Ordering # (<) :: StoreVersion -> StoreVersion -> Bool # (<=) :: StoreVersion -> StoreVersion -> Bool # (>) :: StoreVersion -> StoreVersion -> Bool # (>=) :: StoreVersion -> StoreVersion -> Bool # max :: StoreVersion -> StoreVersion -> StoreVersion # min :: StoreVersion -> StoreVersion -> StoreVersion #
Show StoreVersion # |
Methods showsPrec :: Int -> StoreVersion -> ShowS # show :: StoreVersion -> String # showList :: [StoreVersion] -> ShowS #
Generic StoreVersion # |
Associated Types type Rep StoreVersion :: * -> * # Methods from :: StoreVersion -> Rep StoreVersion x # to :: Rep StoreVersion x -> StoreVersion #
Store StoreVersion # |
Methods size :: Size StoreVersion # poke :: StoreVersion -> Poke () # peek :: Peek StoreVersion #
type Rep StoreVersion # |
type Rep StoreVersion = D1 (MetaData "StoreVersion" "Data.Store.Version" "store-0.4.3.1-EpVqotWYweoKbYCXS17KQt" True) (C1 (MetaCons "StoreVersion" PrefixI True) (S1 (MetaSel (Just Symbol "unStoreVersion") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ByteString)))

data VersionConfig a #

Configuration for the version checking of a particular type.

Constructors

VersionConfig |
Fields vcExpectedHash :: Maybe String When set, specifies the hash which is expected to be computed. vcManualName :: Maybe String When set, specifies the name to instead use to tag the data. vcIgnore :: Set String DataTypes to ignore. vcRenames :: Map String String Allowed renamings of datatypes, useful when they move.

Instances

Eq (VersionConfig a) # |
Methods (==) :: VersionConfig a -> VersionConfig a -> Bool # (/=) :: VersionConfig a -> VersionConfig a -> Bool #
Data a => Data (VersionConfig a) # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> VersionConfig a -> c (VersionConfig a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (VersionConfig a) # toConstr :: VersionConfig a -> Constr # dataTypeOf :: VersionConfig a -> DataType # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c (VersionConfig a)) # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (VersionConfig a)) # gmapT :: (forall b. Data b => b -> b) -> VersionConfig a -> VersionConfig a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> VersionConfig a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> VersionConfig a -> r # gmapQ :: (forall d. Data d => d -> u) -> VersionConfig a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> VersionConfig a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> VersionConfig a -> m (VersionConfig a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> VersionConfig a -> m (VersionConfig a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> VersionConfig a -> m (VersionConfig a) #
Show (VersionConfig a) # |
Methods showsPrec :: Int -> VersionConfig a -> ShowS # show :: VersionConfig a -> String # showList :: [VersionConfig a] -> ShowS #
Generic (VersionConfig a) # |
Associated Types type Rep (VersionConfig a) :: * -> * # Methods from :: VersionConfig a -> Rep (VersionConfig a) x # to :: Rep (VersionConfig a) x -> VersionConfig a #
type Rep (VersionConfig a) # |
type Rep (VersionConfig a) = D1 (MetaData "VersionConfig" "Data.Store.Version" "store-0.4.3.1-EpVqotWYweoKbYCXS17KQt" False) (C1 (MetaCons "VersionConfig" PrefixI True) ((:*:) ((:*:) (S1 (MetaSel (Just Symbol "vcExpectedHash") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Maybe String))) (S1 (MetaSel (Just Symbol "vcManualName") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Maybe String)))) ((:*:) (S1 (MetaSel (Just Symbol "vcIgnore") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Set String))) (S1 (MetaSel (Just Symbol "vcRenames") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Map String String))))))

hashedVersionConfig :: String -> VersionConfig a #

namedVersionConfig :: String -> String -> VersionConfig a #

encodeWithVersionQ :: Data a => VersionConfig a -> Q Exp #

decodeWithVersionQ :: Data a => VersionConfig a -> Q Exp #