use libmqm_sys::Mqi;
use crate::{
Library,
result::ResultComp,
structs,
types::{self, QueueManagerName},
};
pub trait AsConnection {
type Lib: Library<MQ: Mqi>;
type Thread;
fn as_connection(&self) -> &crate::Connection<Self::Lib, Self::Thread>;
}
pub type ConnectParam<'a> = structs::MQCNO<'a>;
pub trait Threading {
const MQCNO_HANDLE_SHARE: types::MQLONG;
}
pub trait ConnectValue<S> {
fn connect_consume<'a, F>(param: &mut ConnectParam<'a>, mqi: F) -> ResultComp<Self>
where
F: FnOnce(&mut ConnectParam<'a>) -> ResultComp<S>,
Self: std::marker::Sized;
}
pub trait ConnectAttr<S> {
fn connect_extract<'a, F>(param: &mut ConnectParam<'a>, mqi: F) -> ResultComp<(Self, S)>
where
F: FnOnce(&mut ConnectParam<'a>) -> ResultComp<S>,
Self: std::marker::Sized;
}
#[expect(unused_variables)]
#[diagnostic::on_unimplemented(
message = "{Self} does not implement `ConnectOption` so it can't be used as an argument for MQI connect"
)]
pub unsafe trait ConnectOption<'a> {
#[inline]
fn queue_manager_name(&self) -> Option<&QueueManagerName> {
None
}
#[inline]
fn apply_param(&self, structs: &mut ConnectStructs<'a>) -> ConnectStructFlags {
CONNECT_HAS_CNO
}
}
#[derive(Debug, Clone)]
pub struct ConnectStructs<'ptr> {
pub cno: structs::MQCNO<'ptr>,
pub sco: structs::MQSCO<'ptr>,
pub csp: structs::MQCSP<'ptr>,
pub cd: structs::MQCD<'ptr>,
#[cfg(feature = "mqc_9_3_0_0")]
pub bno: structs::MQBNO,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
derive_more::BitAnd,
derive_more::BitAndAssign,
derive_more::BitOr,
derive_more::BitXorAssign,
)]
pub struct ConnectStructFlags(usize);
pub const CONNECT_HAS_NONE: ConnectStructFlags = ConnectStructFlags(0b00000);
pub const CONNECT_HAS_CNO: ConnectStructFlags = ConnectStructFlags(0b00000);
pub const CONNECT_HAS_SCO: ConnectStructFlags = ConnectStructFlags(0b00010);
pub const CONNECT_HAS_CD: ConnectStructFlags = ConnectStructFlags(0b00100);
pub const CONNECT_HAS_CSP: ConnectStructFlags = ConnectStructFlags(0b01000);
#[cfg(feature = "mqc_9_3_0_0")]
pub const CONNECT_HAS_BNO: ConnectStructFlags = ConnectStructFlags(0b10000);