content: module Rattletrap.Type.Keyframe where
  
  import qualified Rattletrap.ByteGet as ByteGet
  import qualified Rattletrap.BytePut as BytePut
  import qualified Rattletrap.Schema as Schema
  import qualified Rattletrap.Type.F32 as F32
  import qualified Rattletrap.Type.U32 as U32
  import qualified Rattletrap.Utility.Json as Json
  
  data Keyframe = Keyframe
    { -- | When this key frame occurs, in seconds.
      time :: F32.F32,
      -- | The frame number of this key frame, starting from 0.
      frame :: U32.U32,
      -- | The bit position of this key frame in the stream.
      position :: U32.U32
    }
    deriving (Eq, Show)
  
  instance Json.FromJSON Keyframe where
    parseJSON = Json.withObject "Keyframe" $ \object -> do
      time <- Json.required object "time"
      frame <- Json.required object "frame"
      position <- Json.required object "position"
      pure Keyframe {time, frame, position}
  
  instance Json.ToJSON Keyframe where
    toJSON x =
      Json.object
        [ Json.pair "time" $ time x,
          Json.pair "frame" $ frame x,
          Json.pair "position" $ position x
        ]
  
  schema :: Schema.Schema
  schema =
    Schema.named "keyframe" $
      Schema.object
        [ (Json.pair "time" $ Schema.ref F32.schema, True),
          (Json.pair "frame" $ Schema.ref U32.schema, True),
          (Json.pair "position" $ Schema.ref U32.schema, True)
        ]
  
  bytePut :: Keyframe -> BytePut.BytePut
  bytePut x =
    F32.bytePut (time x) <> U32.bytePut (frame x) <> U32.bytePut (position x)
  
  byteGet :: ByteGet.ByteGet Keyframe
  byteGet = ByteGet.label "Keyframe" $ do
    time <- ByteGet.label "time" F32.byteGet
    frame <- ByteGet.label "frame" U32.byteGet
    position <- ByteGet.label "position" U32.byteGet
    pure Keyframe {time, frame, position}
  