-- | Parsing of unions.
module Data.GI.GIR.Union
    ( Union(..)
    , parseUnion
    ) where

import Data.Maybe (isJust)
import Data.Text (Text)

import Data.GI.GIR.Allocation (AllocationInfo(..), unknownAllocationInfo)
import Data.GI.GIR.Field (Field, parseFields)
import Data.GI.GIR.Method (Method, MethodType(..), parseMethod)
import Data.GI.GIR.Parser
import Data.GI.GIR.Type (queryCType)

data Union = Union {
    Union -> Bool
unionIsBoxed :: Bool,
    Union -> AllocationInfo
unionAllocationInfo :: AllocationInfo,
    Union -> Documentation
unionDocumentation :: Documentation,
    Union -> Int
unionSize :: Int,
    Union -> Maybe Text
unionTypeInit :: Maybe Text,
    Union -> [Field]
unionFields :: [Field],
    Union -> [Method]
unionMethods :: [Method],
    Union -> Maybe Text
unionCType :: Maybe Text,
    Union -> Maybe DeprecationInfo
unionDeprecated :: Maybe DeprecationInfo }
    deriving Int -> Union -> ShowS
[Union] -> ShowS
Union -> String
(Int -> Union -> ShowS)
-> (Union -> String) -> ([Union] -> ShowS) -> Show Union
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Union] -> ShowS
$cshowList :: [Union] -> ShowS
show :: Union -> String
$cshow :: Union -> String
showsPrec :: Int -> Union -> ShowS
$cshowsPrec :: Int -> Union -> ShowS
Show

parseUnion :: Parser (Name, Union)
parseUnion :: Parser (Name, Union)
parseUnion = do
  Name
name <- Parser Name
parseName
  Maybe DeprecationInfo
deprecated <- Parser (Maybe DeprecationInfo)
parseDeprecation
  Documentation
doc <- Parser Documentation
parseDocumentation
  Maybe Text
typeInit <- GIRXMLNamespace -> Name -> Parser (Maybe Text)
queryAttrWithNamespace GIRXMLNamespace
GLibGIRNS Name
"get-type"
  [Field]
fields <- Parser [Field]
parseFields
  [Method]
constructors <- Text -> Parser Method -> Parser [Method]
forall a. Text -> Parser a -> Parser [a]
parseChildrenWithLocalName Text
"constructor" (MethodType -> Parser Method
parseMethod MethodType
Constructor)
  [Method]
methods <- Text -> Parser Method -> Parser [Method]
forall a. Text -> Parser a -> Parser [a]
parseChildrenWithLocalName Text
"method" (MethodType -> Parser Method
parseMethod MethodType
OrdinaryMethod)
  [Method]
functions <- Text -> Parser Method -> Parser [Method]
forall a. Text -> Parser a -> Parser [a]
parseChildrenWithLocalName Text
"function" (MethodType -> Parser Method
parseMethod MethodType
MemberFunction)
  Maybe Text
ctype <- Parser (Maybe Text)
queryCType

  (Name, Union) -> Parser (Name, Union)
forall (m :: * -> *) a. Monad m => a -> m a
return (Name
name,
          Union :: Bool
-> AllocationInfo
-> Documentation
-> Int
-> Maybe Text
-> [Field]
-> [Method]
-> Maybe Text
-> Maybe DeprecationInfo
-> Union
Union {
            unionIsBoxed :: Bool
unionIsBoxed = Maybe Text -> Bool
forall a. Maybe a -> Bool
isJust Maybe Text
typeInit
          , unionAllocationInfo :: AllocationInfo
unionAllocationInfo = AllocationInfo
unknownAllocationInfo
          , unionDocumentation :: Documentation
unionDocumentation = Documentation
doc
          , unionTypeInit :: Maybe Text
unionTypeInit = Maybe Text
typeInit
          , unionSize :: Int
unionSize = String -> Int
forall a. HasCallStack => String -> a
error (String
"unfixed union size " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
name)
          , unionFields :: [Field]
unionFields = [Field]
fields
          , unionMethods :: [Method]
unionMethods = [Method]
constructors [Method] -> [Method] -> [Method]
forall a. [a] -> [a] -> [a]
++ [Method]
methods [Method] -> [Method] -> [Method]
forall a. [a] -> [a] -> [a]
++ [Method]
functions
          , unionCType :: Maybe Text
unionCType = Maybe Text
ctype
          , unionDeprecated :: Maybe DeprecationInfo
unionDeprecated = Maybe DeprecationInfo
deprecated
          })