content: 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}
  