packages feed

haskell-gi-0.10: src/GI/GIR/Callable.hs

module GI.GIR.Callable
    ( Callable(..)
    , parseCallable
    ) where

import GI.Type (Type)
import GI.GIR.Arg (Arg(..), parseArg, parseTransfer)
import GI.GIR.BasicTypes (Transfer(..))
import GI.GIR.Parser
import GI.GIR.Type (parseType)

data Callable = Callable {
        returnType :: Type,
        returnMayBeNull :: Bool,
        returnTransfer :: Transfer,
        args :: [Arg],
        skipReturn :: Bool,
        callableDeprecated :: Maybe DeprecationInfo
    } deriving (Show, Eq)

parseArgs :: Parser [Arg]
parseArgs = do
  paramSets <- parseChildrenWithLocalName "parameters" parseArgSet
  case paramSets of
    [] -> return []
    (ps:[]) -> return ps
    _ -> parseError $ "Unexpected multiple \"parameters\" tag"
  where parseArgSet = parseChildrenWithLocalName "parameter" parseArg

parseOneReturn :: Parser (Type, Bool, Transfer, Bool)
parseOneReturn = do
  returnType <- parseType
  mayBeNull <- optionalAttr "allow-none" False parseBool
  transfer <- parseTransfer
  skip <- optionalAttr "skip" False parseBool
  return (returnType, mayBeNull, transfer, skip)

parseReturn :: Parser (Type, Bool, Transfer, Bool)
parseReturn = do
  returnSets <- parseChildrenWithLocalName "return-value" parseOneReturn
  case returnSets of
    (r:[]) -> return r
    [] -> parseError $ "No return information found"
    _ -> parseError $ "Multiple return values found"

parseCallable :: Parser Callable
parseCallable = do
  args <- parseArgs
  (returnType, mayBeNull, transfer, skip) <- parseReturn
  deprecated <- parseDeprecation
  return $ Callable {
                  returnType = returnType
                , returnMayBeNull = mayBeNull
                , returnTransfer = transfer
                , args = args
                , skipReturn = skip
                , callableDeprecated = deprecated
                }