use std::{ffi::c_int, net::Ipv6Addr,fmt};
use crate::{IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, LocalFrom, OptWMarker, SockOptMarker, ipv6_mreq, in6_addr};
#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct Ip6AddMembership(ipv6_mreq);
#[cfg(unix)]
impl fmt::Debug for Ip6AddMembership
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
f.debug_tuple("Ip6AddMembership").field(&self.0).finish()
}
}
#[cfg(windows)]
impl fmt::Debug for Ip6AddMembership
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
f.debug_tuple("Ip6AddMembership").finish()
}
}
impl SockOptMarker for Ip6AddMembership
{
const SO_LEVEL: c_int = IPPROTO_IPV6;
const SO_OPTNAME: c_int = IPV6_ADD_MEMBERSHIP;
type DataType = (Ipv6Addr, u32);
type InputType = ();
#[inline]
fn from(_value: Self::InputType) -> Self
{
panic!("Ip6AddMembership cannot be read");
}
#[inline]
fn get(self) -> Self::DataType
{
panic!("Ip6AddMembership cannot be consumed");
}
#[inline]
fn from_user(inp: Self::DataType) -> Self where Self: Sized
{
return Self(
ipv6_mreq
{
ipv6mr_multiaddr: <in6_addr as LocalFrom<&Ipv6Addr>>::from(&inp.0),
ipv6mr_interface: inp.1,
}
);
}
}
impl OptWMarker for Ip6AddMembership {}