use objc2::{Message, extern_protocol, msg_send, rc::Retained, runtime::ProtocolObject};
use objc2_foundation::{NSError, NSObjectProtocol, NSString};
use crate::{
MTL4BinaryFunction, MTL4BinaryFunctionDescriptor, MTL4ComputePipelineDescriptor, MTL4PipelineDescriptor,
MTL4PipelineStageDynamicLinkingDescriptor, MTL4RenderPipelineDynamicLinkingDescriptor, MTLComputePipelineState,
MTLRenderPipelineState,
};
extern_protocol!(
pub unsafe trait MTL4Archive: NSObjectProtocol + Send + Sync {
#[unsafe(method(newComputePipelineStateWithDescriptor:error:_))]
#[unsafe(method_family = new)]
fn new_compute_pipeline_state_with_descriptor(
&self,
descriptor: &MTL4ComputePipelineDescriptor,
) -> Result<Retained<ProtocolObject<dyn MTLComputePipelineState>>, Retained<NSError>>;
#[unsafe(method(newComputePipelineStateWithDescriptor:dynamicLinkingDescriptor:error:_))]
#[unsafe(method_family = new)]
fn new_compute_pipeline_state_with_descriptor_dynamic_linking_descriptor(
&self,
descriptor: &MTL4ComputePipelineDescriptor,
dynamic_linking_descriptor: &MTL4PipelineStageDynamicLinkingDescriptor,
) -> Result<Retained<ProtocolObject<dyn MTLComputePipelineState>>, Retained<NSError>>;
#[unsafe(method(newRenderPipelineStateWithDescriptor:error:_))]
#[unsafe(method_family = new)]
fn new_render_pipeline_state_with_descriptor(
&self,
descriptor: &MTL4PipelineDescriptor,
) -> Result<Retained<ProtocolObject<dyn MTLRenderPipelineState>>, Retained<NSError>>;
#[unsafe(method(newRenderPipelineStateWithDescriptor:dynamicLinkingDescriptor:error:_))]
#[unsafe(method_family = new)]
fn new_render_pipeline_state_with_descriptor_dynamic_linking_descriptor(
&self,
descriptor: &MTL4PipelineDescriptor,
dynamic_linking_descriptor: &MTL4RenderPipelineDynamicLinkingDescriptor,
) -> Result<Retained<ProtocolObject<dyn MTLRenderPipelineState>>, Retained<NSError>>;
#[unsafe(method(newBinaryFunctionWithDescriptor:error:_))]
#[unsafe(method_family = new)]
fn new_binary_function_with_descriptor(
&self,
descriptor: &MTL4BinaryFunctionDescriptor,
) -> Result<Retained<ProtocolObject<dyn MTL4BinaryFunction>>, Retained<NSError>>;
}
);
pub trait MTL4ArchiveExt: MTL4Archive + Message {
fn label(&self) -> Option<String> {
let s: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
s.map(|v| v.to_string())
}
fn set_label(
&self,
label: Option<&str>,
) {
unsafe {
let _: () = msg_send![self, setLabel: label.map(NSString::from_str).as_deref()];
}
}
}
impl<T: MTL4Archive + Message> MTL4ArchiveExt for T {}