{-# LANGUAGE OverloadedStrings #-}
module HsLua.Packaging.UDType
( DocumentedType
, DocumentedTypeWithList
, deftype
, deftype'
, method
, property
, property'
, possibleProperty
, possibleProperty'
, readonly
, readonly'
, alias
, operation
, peekUD
, pushUD
, initType
, udparam
, udresult
, udDocs
, udTypeSpec
, Member
, Operation (..)
, Property
, Possible (..)
) where
import Data.Map (Map)
import Data.Text (Text)
import HsLua.Core
import HsLua.Marshalling
import HsLua.ObjectOrientation
import HsLua.ObjectOrientation.Operation (metamethodName)
import HsLua.Packaging.Function
import HsLua.Typing (pushTypeSpec)
import qualified Data.Map as Map
type DocumentedType e a = UDType e (DocumentedFunction e) a
type DocumentedTypeWithList e a itemtype =
UDTypeWithList e (DocumentedFunction e) a itemtype
deftype :: LuaError e
=> Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> DocumentedType e a
deftype :: forall e a.
LuaError e =>
Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> DocumentedType e a
deftype = Pusher e (DocumentedFunction e)
-> Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> UDType e (DocumentedFunction e) a
forall e fn a.
Pusher e fn
-> Name -> [(Operation, fn)] -> [Member e fn a] -> UDType e fn a
deftypeGeneric Pusher e (DocumentedFunction e)
forall e. LuaError e => DocumentedFunction e -> LuaE e ()
pushDocumentedFunction
deftype' :: LuaError e
=> Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> Maybe (ListSpec e a itemtype)
-> DocumentedTypeWithList e a itemtype
deftype' :: forall e a itemtype.
LuaError e =>
Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> Maybe (ListSpec e a itemtype)
-> DocumentedTypeWithList e a itemtype
deftype' = Pusher e (DocumentedFunction e)
-> Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> Maybe (ListSpec e a itemtype)
-> UDTypeWithList e (DocumentedFunction e) a itemtype
forall e fn a itemtype.
Pusher e fn
-> Name
-> [(Operation, fn)]
-> [Member e fn a]
-> Maybe (ListSpec e a itemtype)
-> UDTypeWithList e fn a itemtype
deftypeGeneric' Pusher e (DocumentedFunction e)
forall e. LuaError e => DocumentedFunction e -> LuaE e ()
pushDocumentedFunction
method :: DocumentedFunction e
-> Member e (DocumentedFunction e) a
method :: forall e a.
DocumentedFunction e -> Member e (DocumentedFunction e) a
method DocumentedFunction e
f = Name -> DocumentedFunction e -> Member e (DocumentedFunction e) a
forall fn e a. Name -> fn -> Member e fn a
methodGeneric (DocumentedFunction e -> Name
forall e. DocumentedFunction e -> Name
functionName DocumentedFunction e
f) DocumentedFunction e
f
operation :: Operation
-> DocumentedFunction e
-> (Operation, DocumentedFunction e)
operation :: forall e.
Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
operation Operation
op DocumentedFunction e
f = (,) Operation
op (DocumentedFunction e -> (Operation, DocumentedFunction e))
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall a b. (a -> b) -> a -> b
$ Name -> DocumentedFunction e -> DocumentedFunction e
forall e. Name -> DocumentedFunction e -> DocumentedFunction e
setName (Operation -> Name
metamethodName Operation
op) DocumentedFunction e
f
udparam :: LuaError e
=> DocumentedTypeWithList e a itemtype
-> Text
-> Text
-> Parameter e a
udparam :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype
-> Text -> Text -> Parameter e a
udparam DocumentedTypeWithList e a itemtype
ty = Peeker e a -> TypeSpec -> Text -> Text -> Parameter e a
forall e a. Peeker e a -> TypeSpec -> Text -> Text -> Parameter e a
parameter (DocumentedTypeWithList e a itemtype -> Peeker e a
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> Peeker e a
peekUDGeneric DocumentedTypeWithList e a itemtype
ty) (DocumentedTypeWithList e a itemtype -> TypeSpec
forall e fn a itemtype. UDTypeWithList e fn a itemtype -> TypeSpec
udTypeSpec DocumentedTypeWithList e a itemtype
ty)
udresult :: LuaError e
=> DocumentedTypeWithList e a itemtype
-> Text
-> FunctionResults e a
udresult :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> Text -> FunctionResults e a
udresult DocumentedTypeWithList e a itemtype
ty = Pusher e a -> TypeSpec -> Text -> FunctionResults e a
forall e a. Pusher e a -> TypeSpec -> Text -> FunctionResults e a
functionResult (DocumentedTypeWithList e a itemtype -> Pusher e a
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> a -> LuaE e ()
pushUD DocumentedTypeWithList e a itemtype
ty) (DocumentedTypeWithList e a itemtype -> TypeSpec
forall e fn a itemtype. UDTypeWithList e fn a itemtype -> TypeSpec
udTypeSpec DocumentedTypeWithList e a itemtype
ty)
pushUD :: LuaError e => DocumentedTypeWithList e a itemtype -> a -> LuaE e ()
pushUD :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> a -> LuaE e ()
pushUD = (UDTypeWithList e (DocumentedFunction e) a itemtype -> LuaE e ())
-> UDTypeWithList e (DocumentedFunction e) a itemtype
-> a
-> LuaE e ()
forall e fn a itemtype.
LuaError e =>
(UDTypeWithList e fn a itemtype -> LuaE e ())
-> UDTypeWithList e fn a itemtype -> a -> LuaE e ()
pushUDGeneric UDTypeWithList e (DocumentedFunction e) a itemtype -> LuaE e ()
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> LuaE e ()
pushUDTypeDocs
peekUD :: LuaError e => DocumentedTypeWithList e a itemtype -> Peeker e a
peekUD :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> Peeker e a
peekUD = UDTypeWithList e (DocumentedFunction e) a itemtype -> Peeker e a
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> Peeker e a
peekUDGeneric
initType :: LuaError e
=> DocumentedTypeWithList e a itemtype
-> LuaE e Name
initType :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> LuaE e Name
initType = (UDTypeWithList e (DocumentedFunction e) a itemtype -> LuaE e ())
-> UDTypeWithList e (DocumentedFunction e) a itemtype
-> LuaE e Name
forall e fn a itemtype.
LuaError e =>
(UDTypeWithList e fn a itemtype -> LuaE e ())
-> UDTypeWithList e fn a itemtype -> LuaE e Name
initTypeGeneric UDTypeWithList e (DocumentedFunction e) a itemtype -> LuaE e ()
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> LuaE e ()
pushUDTypeDocs
pushUDTypeDocs :: LuaError e
=> DocumentedTypeWithList e a itemtype
-> LuaE e ()
pushUDTypeDocs :: forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> LuaE e ()
pushUDTypeDocs DocumentedTypeWithList e a itemtype
ty = do
Name -> LuaE e ()
forall e. Name -> LuaE e ()
pushName Name
"docs"
[(Name, DocumentedTypeWithList e a itemtype -> LuaE e ())]
-> DocumentedTypeWithList e a itemtype -> LuaE e ()
forall e a.
LuaError e =>
[(Name, a -> LuaE e ())] -> a -> LuaE e ()
pushAsTable
[ (Name
"name", Name -> LuaE e ()
forall e. Name -> LuaE e ()
pushName (Name -> LuaE e ())
-> (DocumentedTypeWithList e a itemtype -> Name)
-> DocumentedTypeWithList e a itemtype
-> LuaE e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DocumentedTypeWithList e a itemtype -> Name
forall e fn a itemtype. UDTypeWithList e fn a itemtype -> Name
udName)
, (Name
"properties", Map Name (Property e a) -> LuaE e ()
forall e a. LuaError e => Map Name (Property e a) -> LuaE e ()
pushPropertyDocs (Map Name (Property e a) -> LuaE e ())
-> (DocumentedTypeWithList e a itemtype -> Map Name (Property e a))
-> DocumentedTypeWithList e a itemtype
-> LuaE e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DocumentedTypeWithList e a itemtype -> Map Name (Property e a)
forall e fn a itemtype.
UDTypeWithList e fn a itemtype -> Map Name (Property e a)
udProperties)
] DocumentedTypeWithList e a itemtype
ty
StackIndex -> LuaE e ()
forall e. LuaError e => StackIndex -> LuaE e ()
rawset (CInt -> StackIndex
nth CInt
3)
pushPropertyDocs :: LuaError e
=> Map Name (Property e a)
-> LuaE e ()
pushPropertyDocs :: forall e a. LuaError e => Map Name (Property e a) -> LuaE e ()
pushPropertyDocs = Pusher e Name
-> Pusher e (Property e a) -> Pusher e [(Name, Property e a)]
forall e a b.
LuaError e =>
Pusher e a -> Pusher e b -> Pusher e [(a, b)]
pushKeyValuePairs Pusher e Name
forall e. Name -> LuaE e ()
pushName Pusher e (Property e a)
forall {e} {a}. Property e a -> LuaE e ()
pushPropDocs Pusher e [(Name, Property e a)]
-> (Map Name (Property e a) -> [(Name, Property e a)])
-> Map Name (Property e a)
-> LuaE e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Name (Property e a) -> [(Name, Property e a)]
forall k a. Map k a -> [(k, a)]
Map.toList
where
pushPropDocs :: Property e a -> LuaE e ()
pushPropDocs = [(Name, Property e a -> LuaE e ())] -> Property e a -> LuaE e ()
forall e a.
LuaError e =>
[(Name, a -> LuaE e ())] -> a -> LuaE e ()
pushAsTable
[ (Name
"description", Pusher e Text
forall e. Pusher e Text
pushText Pusher e Text
-> (Property e a -> Text) -> Property e a -> LuaE e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Property e a -> Text
forall e a. Property e a -> Text
propertyDescription)
, (Name
"type", TypeSpec -> LuaE e ()
forall e. LuaError e => TypeSpec -> LuaE e ()
pushTypeSpec (TypeSpec -> LuaE e ())
-> (Property e a -> TypeSpec) -> Property e a -> LuaE e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Property e a -> TypeSpec
forall e a. Property e a -> TypeSpec
propertyType)
]