module Rattletrap.Type.Version where import qualified Rattletrap.ByteGet as ByteGet import qualified Rattletrap.BytePut as BytePut import qualified Rattletrap.Type.U32 as U32 import qualified Rattletrap.Utility.Monad as Monad data Version = Version { major :: U32.U32, minor :: U32.U32, patch :: Maybe U32.U32 } deriving (Eq, Show) atLeast :: Int -> Int -> Int -> Version -> Bool atLeast m n p v = (U32.toWord32 (major v) >= fromIntegral m) && (U32.toWord32 (minor v) >= fromIntegral n) && (maybe 0 U32.toWord32 (patch v) >= fromIntegral p) bytePut :: Version -> BytePut.BytePut bytePut x = U32.bytePut (major x) <> U32.bytePut (minor x) <> foldMap U32.bytePut (patch x) byteGet :: ByteGet.ByteGet Version byteGet = ByteGet.label "Version" $ do major <- ByteGet.label "major" U32.byteGet minor <- ByteGet.label "minor" U32.byteGet patch <- ByteGet.label "patch" $ Monad.whenMaybe (U32.toWord32 major >= 868 && U32.toWord32 minor >= 18) U32.byteGet pure Version {major, minor, patch}