module JVM.Data.Raw.AccessFlags where

import Data.Binary (Word16)
import Data.Binary.Put (putWord16be)
import Data.Binary.Write (WriteBinary (writeBinary))
import JVM.Data.Raw.MagicNumbers qualified as MagicNumbers

{- | Very thin wrapper around the access flags defined in the JVM spec.
 These flags may be for a class, field, or method - for a safer interface, see 'JVM.Data.Abstract.AccessFlags'.
-}
data AccessFlag
    = ACC_PUBLIC
    | ACC_PRIVATE
    | ACC_PROTECTED
    | ACC_STATIC
    | ACC_FINAL
    | ACC_VOLATILE
    | ACC_TRANSIENT
    | ACC_SUPER
    | ACC_INTERFACE
    | ACC_ABSTRACT
    | ACC_SYNTHETIC
    | ACC_ANNOTATION
    | ACC_ENUM
    | ACC_SYNCHRONIZED
    | ACC_BRIDGE
    | ACC_VARARGS
    | ACC_NATIVE
    | ACC_STRICT
    deriving (Int -> AccessFlag -> ShowS
[AccessFlag] -> ShowS
AccessFlag -> String
(Int -> AccessFlag -> ShowS)
-> (AccessFlag -> String)
-> ([AccessFlag] -> ShowS)
-> Show AccessFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AccessFlag -> ShowS
showsPrec :: Int -> AccessFlag -> ShowS
$cshow :: AccessFlag -> String
show :: AccessFlag -> String
$cshowList :: [AccessFlag] -> ShowS
showList :: [AccessFlag] -> ShowS
Show)

accessFlagValue :: AccessFlag -> Word16
accessFlagValue :: AccessFlag -> Word16
accessFlagValue AccessFlag
ACC_PUBLIC = Word16
MagicNumbers.accessFlag_PUBLIC
accessFlagValue AccessFlag
ACC_PRIVATE = Word16
MagicNumbers.accessFlag_PRIVATE
accessFlagValue AccessFlag
ACC_PROTECTED = Word16
MagicNumbers.accessFlag_PROTECTED
accessFlagValue AccessFlag
ACC_STATIC = Word16
MagicNumbers.accessFlag_STATIC
accessFlagValue AccessFlag
ACC_FINAL = Word16
MagicNumbers.accessFlag_FINAL
accessFlagValue AccessFlag
ACC_VOLATILE = Word16
MagicNumbers.accessFlag_VOLATILE
accessFlagValue AccessFlag
ACC_TRANSIENT = Word16
MagicNumbers.accessFlag_TRANSIENT
accessFlagValue AccessFlag
ACC_SUPER = Word16
MagicNumbers.accessFlag_SUPER
accessFlagValue AccessFlag
ACC_INTERFACE = Word16
MagicNumbers.accessFlag_INTERFACE
accessFlagValue AccessFlag
ACC_ABSTRACT = Word16
MagicNumbers.accessFlag_ABSTRACT
accessFlagValue AccessFlag
ACC_SYNTHETIC = Word16
MagicNumbers.accessFlag_SYNTHETIC
accessFlagValue AccessFlag
ACC_ANNOTATION = Word16
MagicNumbers.accessFlag_ANNOTATION
accessFlagValue AccessFlag
ACC_ENUM = Word16
MagicNumbers.accessFlag_ENUM
accessFlagValue AccessFlag
ACC_SYNCHRONIZED = Word16
MagicNumbers.accessFlag_SYNCHRONIZED
accessFlagValue AccessFlag
ACC_BRIDGE = Word16
MagicNumbers.accessFlag_BRIDGE
accessFlagValue AccessFlag
ACC_VARARGS = Word16
MagicNumbers.accessFlag_VARARGS
accessFlagValue AccessFlag
ACC_NATIVE = Word16
MagicNumbers.accessFlag_NATIVE
accessFlagValue AccessFlag
ACC_STRICT = Word16
MagicNumbers.accessFlag_STRICT

instance WriteBinary AccessFlag where
    writeBinary :: AccessFlag -> Put
writeBinary = Word16 -> Put
putWord16be (Word16 -> Put) -> (AccessFlag -> Word16) -> AccessFlag -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AccessFlag -> Word16
accessFlagValue