packages feed

rattletrap-14.1.4: src/lib/Rattletrap/Type/Version.hs

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}