{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

A format definition
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Gst.Structs.FormatDefinition
    (

-- * Exported types
    FormatDefinition(..)                    ,
    newZeroFormatDefinition                 ,
    noFormatDefinition                      ,


 -- * Properties
-- ** description #attr:description#
{- | A longer description of the format
-}
    clearFormatDefinitionDescription        ,
#if ENABLE_OVERLOADING
    formatDefinition_description            ,
#endif
    getFormatDefinitionDescription          ,
    setFormatDefinitionDescription          ,


-- ** nick #attr:nick#
{- | A short nick of the format
-}
    clearFormatDefinitionNick               ,
#if ENABLE_OVERLOADING
    formatDefinition_nick                   ,
#endif
    getFormatDefinitionNick                 ,
    setFormatDefinitionNick                 ,


-- ** quark #attr:quark#
{- | A quark for the nick
-}
#if ENABLE_OVERLOADING
    formatDefinition_quark                  ,
#endif
    getFormatDefinitionQuark                ,
    setFormatDefinitionQuark                ,


-- ** value #attr:value#
{- | The unique id of this format
-}
#if ENABLE_OVERLOADING
    formatDefinition_value                  ,
#endif
    getFormatDefinitionValue                ,
    setFormatDefinitionValue                ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import {-# SOURCE #-} qualified GI.Gst.Enums as Gst.Enums

-- | Memory-managed wrapper type.
newtype FormatDefinition = FormatDefinition (ManagedPtr FormatDefinition)
instance WrappedPtr FormatDefinition where
    wrappedPtrCalloc = callocBytes 32
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 32 >=> wrapPtr FormatDefinition)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `FormatDefinition` struct initialized to zero.
newZeroFormatDefinition :: MonadIO m => m FormatDefinition
newZeroFormatDefinition = liftIO $ wrappedPtrCalloc >>= wrapPtr FormatDefinition

instance tag ~ 'AttrSet => Constructible FormatDefinition tag where
    new _ attrs = do
        o <- newZeroFormatDefinition
        GI.Attributes.set o attrs
        return o


-- | A convenience alias for `Nothing` :: `Maybe` `FormatDefinition`.
noFormatDefinition :: Maybe FormatDefinition
noFormatDefinition = Nothing

{- |
Get the value of the “@value@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' formatDefinition #value
@
-}
getFormatDefinitionValue :: MonadIO m => FormatDefinition -> m Gst.Enums.Format
getFormatDefinitionValue s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

{- |
Set the value of the “@value@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' formatDefinition [ #value 'Data.GI.Base.Attributes.:=' value ]
@
-}
setFormatDefinitionValue :: MonadIO m => FormatDefinition -> Gst.Enums.Format -> m ()
setFormatDefinitionValue s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 0) (val' :: CUInt)

#if ENABLE_OVERLOADING
data FormatDefinitionValueFieldInfo
instance AttrInfo FormatDefinitionValueFieldInfo where
    type AttrAllowedOps FormatDefinitionValueFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint FormatDefinitionValueFieldInfo = (~) Gst.Enums.Format
    type AttrBaseTypeConstraint FormatDefinitionValueFieldInfo = (~) FormatDefinition
    type AttrGetType FormatDefinitionValueFieldInfo = Gst.Enums.Format
    type AttrLabel FormatDefinitionValueFieldInfo = "value"
    type AttrOrigin FormatDefinitionValueFieldInfo = FormatDefinition
    attrGet _ = getFormatDefinitionValue
    attrSet _ = setFormatDefinitionValue
    attrConstruct = undefined
    attrClear _ = undefined

formatDefinition_value :: AttrLabelProxy "value"
formatDefinition_value = AttrLabelProxy

#endif


{- |
Get the value of the “@nick@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' formatDefinition #nick
@
-}
getFormatDefinitionNick :: MonadIO m => FormatDefinition -> m (Maybe T.Text)
getFormatDefinitionNick s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO CString
    result <- SP.convertIfNonNull val $ \val' -> do
        val'' <- cstringToText val'
        return val''
    return result

{- |
Set the value of the “@nick@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' formatDefinition [ #nick 'Data.GI.Base.Attributes.:=' value ]
@
-}
setFormatDefinitionNick :: MonadIO m => FormatDefinition -> CString -> m ()
setFormatDefinitionNick s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (val :: CString)

{- |
Set the value of the “@nick@” field to `Nothing`.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.clear' #nick
@
-}
clearFormatDefinitionNick :: MonadIO m => FormatDefinition -> m ()
clearFormatDefinitionNick s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (FP.nullPtr :: CString)

#if ENABLE_OVERLOADING
data FormatDefinitionNickFieldInfo
instance AttrInfo FormatDefinitionNickFieldInfo where
    type AttrAllowedOps FormatDefinitionNickFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint FormatDefinitionNickFieldInfo = (~) CString
    type AttrBaseTypeConstraint FormatDefinitionNickFieldInfo = (~) FormatDefinition
    type AttrGetType FormatDefinitionNickFieldInfo = Maybe T.Text
    type AttrLabel FormatDefinitionNickFieldInfo = "nick"
    type AttrOrigin FormatDefinitionNickFieldInfo = FormatDefinition
    attrGet _ = getFormatDefinitionNick
    attrSet _ = setFormatDefinitionNick
    attrConstruct = undefined
    attrClear _ = clearFormatDefinitionNick

formatDefinition_nick :: AttrLabelProxy "nick"
formatDefinition_nick = AttrLabelProxy

#endif


{- |
Get the value of the “@description@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' formatDefinition #description
@
-}
getFormatDefinitionDescription :: MonadIO m => FormatDefinition -> m (Maybe T.Text)
getFormatDefinitionDescription s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO CString
    result <- SP.convertIfNonNull val $ \val' -> do
        val'' <- cstringToText val'
        return val''
    return result

{- |
Set the value of the “@description@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' formatDefinition [ #description 'Data.GI.Base.Attributes.:=' value ]
@
-}
setFormatDefinitionDescription :: MonadIO m => FormatDefinition -> CString -> m ()
setFormatDefinitionDescription s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 16) (val :: CString)

{- |
Set the value of the “@description@” field to `Nothing`.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.clear' #description
@
-}
clearFormatDefinitionDescription :: MonadIO m => FormatDefinition -> m ()
clearFormatDefinitionDescription s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 16) (FP.nullPtr :: CString)

#if ENABLE_OVERLOADING
data FormatDefinitionDescriptionFieldInfo
instance AttrInfo FormatDefinitionDescriptionFieldInfo where
    type AttrAllowedOps FormatDefinitionDescriptionFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint FormatDefinitionDescriptionFieldInfo = (~) CString
    type AttrBaseTypeConstraint FormatDefinitionDescriptionFieldInfo = (~) FormatDefinition
    type AttrGetType FormatDefinitionDescriptionFieldInfo = Maybe T.Text
    type AttrLabel FormatDefinitionDescriptionFieldInfo = "description"
    type AttrOrigin FormatDefinitionDescriptionFieldInfo = FormatDefinition
    attrGet _ = getFormatDefinitionDescription
    attrSet _ = setFormatDefinitionDescription
    attrConstruct = undefined
    attrClear _ = clearFormatDefinitionDescription

formatDefinition_description :: AttrLabelProxy "description"
formatDefinition_description = AttrLabelProxy

#endif


{- |
Get the value of the “@quark@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' formatDefinition #quark
@
-}
getFormatDefinitionQuark :: MonadIO m => FormatDefinition -> m Word32
getFormatDefinitionQuark s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO Word32
    return val

{- |
Set the value of the “@quark@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' formatDefinition [ #quark 'Data.GI.Base.Attributes.:=' value ]
@
-}
setFormatDefinitionQuark :: MonadIO m => FormatDefinition -> Word32 -> m ()
setFormatDefinitionQuark s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 24) (val :: Word32)

#if ENABLE_OVERLOADING
data FormatDefinitionQuarkFieldInfo
instance AttrInfo FormatDefinitionQuarkFieldInfo where
    type AttrAllowedOps FormatDefinitionQuarkFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint FormatDefinitionQuarkFieldInfo = (~) Word32
    type AttrBaseTypeConstraint FormatDefinitionQuarkFieldInfo = (~) FormatDefinition
    type AttrGetType FormatDefinitionQuarkFieldInfo = Word32
    type AttrLabel FormatDefinitionQuarkFieldInfo = "quark"
    type AttrOrigin FormatDefinitionQuarkFieldInfo = FormatDefinition
    attrGet _ = getFormatDefinitionQuark
    attrSet _ = setFormatDefinitionQuark
    attrConstruct = undefined
    attrClear _ = undefined

formatDefinition_quark :: AttrLabelProxy "quark"
formatDefinition_quark = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList FormatDefinition
type instance O.AttributeList FormatDefinition = FormatDefinitionAttributeList
type FormatDefinitionAttributeList = ('[ '("value", FormatDefinitionValueFieldInfo), '("nick", FormatDefinitionNickFieldInfo), '("description", FormatDefinitionDescriptionFieldInfo), '("quark", FormatDefinitionQuarkFieldInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
type family ResolveFormatDefinitionMethod (t :: Symbol) (o :: *) :: * where
    ResolveFormatDefinitionMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveFormatDefinitionMethod t FormatDefinition, O.MethodInfo info FormatDefinition p) => O.IsLabelProxy t (FormatDefinition -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveFormatDefinitionMethod t FormatDefinition, O.MethodInfo info FormatDefinition p) => O.IsLabel t (FormatDefinition -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif
#endif

#endif