//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
#[cfg(feature = "objc2-core-services")]
#[cfg(target_vendor = "apple")]
use objc2_core_services::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsappleeventsendoptions?language=objc)
// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSAppleEventSendOptions(pub NSUInteger);
bitflags::bitflags! {
    impl NSAppleEventSendOptions: NSUInteger {
        #[doc(alias = "NSAppleEventSendNoReply")]
        const NoReply = 1;
        #[doc(alias = "NSAppleEventSendQueueReply")]
        const QueueReply = 2;
        #[doc(alias = "NSAppleEventSendWaitForReply")]
        const WaitForReply = 3;
        #[doc(alias = "NSAppleEventSendNeverInteract")]
        const NeverInteract = 16;
        #[doc(alias = "NSAppleEventSendCanInteract")]
        const CanInteract = 32;
        #[doc(alias = "NSAppleEventSendAlwaysInteract")]
        const AlwaysInteract = 48;
        #[doc(alias = "NSAppleEventSendCanSwitchLayer")]
        const CanSwitchLayer = 64;
        #[doc(alias = "NSAppleEventSendDontRecord")]
        const DontRecord = 4096;
        #[doc(alias = "NSAppleEventSendDontExecute")]
        const DontExecute = 8192;
        #[doc(alias = "NSAppleEventSendDontAnnotate")]
        const DontAnnotate = 65536;
        #[doc(alias = "NSAppleEventSendDefaultOptions")]
        const DefaultOptions = 35;
    }
}

unsafe impl Encode for NSAppleEventSendOptions {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

unsafe impl RefEncode for NSAppleEventSendOptions {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsappleeventdescriptor?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSAppleEventDescriptor;
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSAppleEventDescriptor {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSAppleEventDescriptor {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSAppleEventDescriptor {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSAppleEventDescriptor {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSSecureCoding for NSAppleEventDescriptor {}
);

impl NSAppleEventDescriptor {
    extern_methods!(
        #[unsafe(method(nullDescriptor))]
        #[unsafe(method_family = none)]
        pub fn nullDescriptor() -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        /// # Safety
        ///
        /// `bytes` must be a valid pointer or null.
        #[unsafe(method(descriptorWithDescriptorType:bytes:length:))]
        #[unsafe(method_family = none)]
        pub unsafe fn descriptorWithDescriptorType_bytes_length(
            descriptor_type: DescType,
            bytes: *const c_void,
            byte_count: NSUInteger,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[cfg(all(feature = "NSData", feature = "objc2-core-services"))]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(descriptorWithDescriptorType:data:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithDescriptorType_data(
            descriptor_type: DescType,
            data: Option<&NSData>,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[unsafe(method(descriptorWithBoolean:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithBoolean(boolean: Boolean) -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(descriptorWithEnumCode:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithEnumCode(enumerator: OSType) -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(descriptorWithInt32:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithInt32(signed_int: i32) -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(descriptorWithDouble:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithDouble(double_value: c_double) -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(descriptorWithTypeCode:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithTypeCode(type_code: OSType) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(descriptorWithString:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithString(string: &NSString) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "NSDate")]
        #[unsafe(method(descriptorWithDate:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithDate(date: &NSDate) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "NSURL")]
        #[unsafe(method(descriptorWithFileURL:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithFileURL(file_url: &NSURL) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:))]
        #[unsafe(method_family = none)]
        pub fn appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID(
            event_class: AEEventClass,
            event_id: AEEventID,
            target_descriptor: Option<&NSAppleEventDescriptor>,
            return_id: AEReturnID,
            transaction_id: AETransactionID,
        ) -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(listDescriptor))]
        #[unsafe(method_family = none)]
        pub fn listDescriptor() -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(recordDescriptor))]
        #[unsafe(method_family = none)]
        pub fn recordDescriptor() -> Retained<NSAppleEventDescriptor>;

        #[unsafe(method(currentProcessDescriptor))]
        #[unsafe(method_family = none)]
        pub fn currentProcessDescriptor() -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "libc")]
        #[unsafe(method(descriptorWithProcessIdentifier:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithProcessIdentifier(
            process_identifier: libc::pid_t,
        ) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(descriptorWithBundleIdentifier:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithBundleIdentifier(
            bundle_identifier: &NSString,
        ) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "NSURL")]
        #[unsafe(method(descriptorWithApplicationURL:))]
        #[unsafe(method_family = none)]
        pub fn descriptorWithApplicationURL(
            application_url: &NSURL,
        ) -> Retained<NSAppleEventDescriptor>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        /// # Safety
        ///
        /// `ae_desc` must be a valid pointer.
        #[unsafe(method(initWithAEDescNoCopy:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithAEDescNoCopy(
            this: Allocated<Self>,
            ae_desc: NonNull<AEDesc>,
        ) -> Retained<Self>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        /// # Safety
        ///
        /// `bytes` must be a valid pointer or null.
        #[unsafe(method(initWithDescriptorType:bytes:length:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithDescriptorType_bytes_length(
            this: Allocated<Self>,
            descriptor_type: DescType,
            bytes: *const c_void,
            byte_count: NSUInteger,
        ) -> Option<Retained<Self>>;

        #[cfg(all(feature = "NSData", feature = "objc2-core-services"))]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(initWithDescriptorType:data:))]
        #[unsafe(method_family = init)]
        pub fn initWithDescriptorType_data(
            this: Allocated<Self>,
            descriptor_type: DescType,
            data: Option<&NSData>,
        ) -> Option<Retained<Self>>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(initWithEventClass:eventID:targetDescriptor:returnID:transactionID:))]
        #[unsafe(method_family = init)]
        pub fn initWithEventClass_eventID_targetDescriptor_returnID_transactionID(
            this: Allocated<Self>,
            event_class: AEEventClass,
            event_id: AEEventID,
            target_descriptor: Option<&NSAppleEventDescriptor>,
            return_id: AEReturnID,
            transaction_id: AETransactionID,
        ) -> Retained<Self>;

        #[unsafe(method(initListDescriptor))]
        #[unsafe(method_family = init)]
        pub fn initListDescriptor(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(initRecordDescriptor))]
        #[unsafe(method_family = init)]
        pub fn initRecordDescriptor(this: Allocated<Self>) -> Retained<Self>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(aeDesc))]
        #[unsafe(method_family = none)]
        pub fn aeDesc(&self) -> *const AEDesc;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(descriptorType))]
        #[unsafe(method_family = none)]
        pub fn descriptorType(&self) -> DescType;

        #[cfg(feature = "NSData")]
        #[unsafe(method(data))]
        #[unsafe(method_family = none)]
        pub fn data(&self) -> Retained<NSData>;

        #[unsafe(method(booleanValue))]
        #[unsafe(method_family = none)]
        pub fn booleanValue(&self) -> Boolean;

        #[unsafe(method(enumCodeValue))]
        #[unsafe(method_family = none)]
        pub fn enumCodeValue(&self) -> OSType;

        #[unsafe(method(int32Value))]
        #[unsafe(method_family = none)]
        pub fn int32Value(&self) -> i32;

        #[unsafe(method(doubleValue))]
        #[unsafe(method_family = none)]
        pub fn doubleValue(&self) -> c_double;

        #[unsafe(method(typeCodeValue))]
        #[unsafe(method_family = none)]
        pub fn typeCodeValue(&self) -> OSType;

        #[cfg(feature = "NSString")]
        #[unsafe(method(stringValue))]
        #[unsafe(method_family = none)]
        pub fn stringValue(&self) -> Option<Retained<NSString>>;

        #[cfg(feature = "NSDate")]
        #[unsafe(method(dateValue))]
        #[unsafe(method_family = none)]
        pub fn dateValue(&self) -> Option<Retained<NSDate>>;

        #[cfg(feature = "NSURL")]
        #[unsafe(method(fileURLValue))]
        #[unsafe(method_family = none)]
        pub fn fileURLValue(&self) -> Option<Retained<NSURL>>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(eventClass))]
        #[unsafe(method_family = none)]
        pub fn eventClass(&self) -> AEEventClass;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(eventID))]
        #[unsafe(method_family = none)]
        pub fn eventID(&self) -> AEEventID;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(returnID))]
        #[unsafe(method_family = none)]
        pub fn returnID(&self) -> AEReturnID;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(transactionID))]
        #[unsafe(method_family = none)]
        pub fn transactionID(&self) -> AETransactionID;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(setParamDescriptor:forKeyword:))]
        #[unsafe(method_family = none)]
        pub fn setParamDescriptor_forKeyword(
            &self,
            descriptor: &NSAppleEventDescriptor,
            keyword: AEKeyword,
        );

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(paramDescriptorForKeyword:))]
        #[unsafe(method_family = none)]
        pub fn paramDescriptorForKeyword(
            &self,
            keyword: AEKeyword,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(removeParamDescriptorWithKeyword:))]
        #[unsafe(method_family = none)]
        pub fn removeParamDescriptorWithKeyword(&self, keyword: AEKeyword);

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(setAttributeDescriptor:forKeyword:))]
        #[unsafe(method_family = none)]
        pub fn setAttributeDescriptor_forKeyword(
            &self,
            descriptor: &NSAppleEventDescriptor,
            keyword: AEKeyword,
        );

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(attributeDescriptorForKeyword:))]
        #[unsafe(method_family = none)]
        pub fn attributeDescriptorForKeyword(
            &self,
            keyword: AEKeyword,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[cfg(all(feature = "NSDate", feature = "NSError"))]
        #[unsafe(method(sendEventWithOptions:timeout:error:_))]
        #[unsafe(method_family = none)]
        pub fn sendEventWithOptions_timeout_error(
            &self,
            send_options: NSAppleEventSendOptions,
            timeout_in_seconds: NSTimeInterval,
        ) -> Result<Retained<NSAppleEventDescriptor>, Retained<NSError>>;

        #[unsafe(method(isRecordDescriptor))]
        #[unsafe(method_family = none)]
        pub fn isRecordDescriptor(&self) -> bool;

        #[unsafe(method(numberOfItems))]
        #[unsafe(method_family = none)]
        pub fn numberOfItems(&self) -> NSInteger;

        #[unsafe(method(insertDescriptor:atIndex:))]
        #[unsafe(method_family = none)]
        pub fn insertDescriptor_atIndex(
            &self,
            descriptor: &NSAppleEventDescriptor,
            index: NSInteger,
        );

        #[unsafe(method(descriptorAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn descriptorAtIndex(
            &self,
            index: NSInteger,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[unsafe(method(removeDescriptorAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn removeDescriptorAtIndex(&self, index: NSInteger);

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(setDescriptor:forKeyword:))]
        #[unsafe(method_family = none)]
        pub fn setDescriptor_forKeyword(
            &self,
            descriptor: &NSAppleEventDescriptor,
            keyword: AEKeyword,
        );

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(descriptorForKeyword:))]
        #[unsafe(method_family = none)]
        pub fn descriptorForKeyword(
            &self,
            keyword: AEKeyword,
        ) -> Option<Retained<NSAppleEventDescriptor>>;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(removeDescriptorWithKeyword:))]
        #[unsafe(method_family = none)]
        pub fn removeDescriptorWithKeyword(&self, keyword: AEKeyword);

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(keywordForDescriptorAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn keywordForDescriptorAtIndex(&self, index: NSInteger) -> AEKeyword;

        #[cfg(feature = "objc2-core-services")]
        #[cfg(target_vendor = "apple")]
        #[unsafe(method(coerceToDescriptorType:))]
        #[unsafe(method_family = none)]
        pub fn coerceToDescriptorType(
            &self,
            descriptor_type: DescType,
        ) -> Option<Retained<NSAppleEventDescriptor>>;
    );
}

/// Methods declared on superclass `NSObject`.
impl NSAppleEventDescriptor {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSAppleEventDescriptor {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}
