module Graphics.Wayland.Scanner.Names (
ServerClient(..),
registryBindName,
requestInternalCName, eventInternalCName,
requestHaskName, eventHaskName,
interfaceTypeName, interfaceCInterfaceName,
enumTypeName, enumEntryHaskName,
messageListenerTypeName,
messageListenerWrapperName,
interfaceResourceCreator,
capitalize
) where
import Data.Char
import Data.List
import Language.Haskell.TH
import Graphics.Wayland.Scanner.Types
registryBindName :: ProtocolName -> InterfaceName -> Name
registryBindName pname iname = mkName $ "registryBind" ++ (capitalize $ haskifyInterfaceName pname iname)
requestInternalCName :: InterfaceName -> MessageName -> Name
requestInternalCName iface msg = mkName $ iface ++ "_" ++ msg ++ "_request_binding"
eventInternalCName :: InterfaceName -> MessageName -> Name
eventInternalCName iface msg = mkName $ iface ++ "_" ++ msg ++ "_event_binding"
requestHaskName :: ProtocolName -> InterfaceName -> MessageName -> Name
requestHaskName pname iname mname = mkName $ toCamel (haskifyInterfaceName pname iname ++ "_" ++ mname)
eventHaskName :: ProtocolName -> InterfaceName -> MessageName -> Name
eventHaskName pname iname mname = mkName $ toCamel (haskifyInterfaceName pname iname ++ "_" ++ mname)
enumEntryHaskName :: ProtocolName -> InterfaceName -> EnumName -> String -> Name
enumEntryHaskName pname iname ename entryName =
mkName $ haskifyInterfaceName pname iname ++ capitalize (toCamel ename) ++ capitalize (toCamel entryName)
interfaceTypeName :: ProtocolName -> InterfaceName -> Name
interfaceTypeName pname iname = mkName $ capitalize $ haskifyInterfaceName pname iname
interfaceCInterfaceName :: ProtocolName -> InterfaceName -> Name
interfaceCInterfaceName _ iname = mkName $ iname ++ "_c_interface"
enumTypeName :: ProtocolName -> InterfaceName -> EnumName -> Name
enumTypeName pname iname ename = mkName $ capitalize $ haskifyInterfaceName pname iname ++ capitalize (toCamel ename)
messageListenerTypeName :: ServerClient -> ProtocolName -> InterfaceName -> Name
messageListenerTypeName Server pname iname = mkName $ capitalize (haskifyInterfaceName pname iname) ++ "Implementation"
messageListenerTypeName Client pname iname = mkName $ capitalize (haskifyInterfaceName pname iname) ++ "Listener"
messageListenerWrapperName :: ServerClient -> InterfaceName -> MessageName -> Name
messageListenerWrapperName Client iname mname = mkName $ iname ++ "_" ++ mname ++ "_listener_wrapper"
messageListenerWrapperName Server iname mname = mkName $ iname ++ "_" ++ mname ++ "_implementation_wrapper"
interfaceResourceCreator :: ProtocolName -> InterfaceName -> Name
interfaceResourceCreator pname iname = mkName $ pname ++ "_" ++ iname ++ "_resource_create"
haskifyInterfaceName :: ProtocolName -> InterfaceName -> String
haskifyInterfaceName pname iname =
toCamel $ removeInitial (pname ++ "_") $ removeInitial "wl_" iname
removeInitial :: Eq a => [a] -> [a] -> [a]
removeInitial remove input = if remove `isPrefixOf` input
then drop (length remove) input
else input
toCamel :: String -> String
toCamel (a:'_':c:d) | isAlpha a, isAlpha c = a : toUpper c : toCamel d
toCamel (a:b) = a : toCamel b
toCamel x = x
capitalize :: String -> String
capitalize x = toUpper (head x) : tail x