packages feed

wgpu-hs-0.1.0.0: src-internal/WGPU/Internal/ChainedStruct.hs

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RecordWildCards #-}

-- |
module WGPU.Internal.ChainedStruct
  ( -- * Types
    ChainedStruct (..),
  )
where

import Foreign (Ptr, castPtr, nullPtr)
import WGPU.Internal.Memory (ToRaw, raw)
import WGPU.Raw.Generated.Enum.WGPUSType (WGPUSType)
import WGPU.Raw.Generated.Struct.WGPUChainedStruct (WGPUChainedStruct)
import qualified WGPU.Raw.Generated.Struct.WGPUChainedStruct as WGPUChainedStruct

-- | Represents a chained structure.
data ChainedStruct a
  = -- | Empty chained structure, but with a type tag.
    EmptyChain WGPUSType
  | -- | Chained structue that points to the next structure in a chain.
    PtrChain WGPUSType (Ptr a)

instance ToRaw (ChainedStruct a) WGPUChainedStruct where
  raw chainedStruct =
    case chainedStruct of
      EmptyChain sType ->
        pure
          WGPUChainedStruct.WGPUChainedStruct
            { next = nullPtr,
              sType = sType
            }
      PtrChain sType ptr ->
        pure
          WGPUChainedStruct.WGPUChainedStruct
            { next = castPtr ptr,
              sType = sType
            }