pub enum UDTOpt {
UDT_MSS,
UDT_SNDSYN,
UDT_RCVSYN,
UDT_MAXBW
}
pub trait UdtOption<T> {
fn get_type() -> UDTOpt;
}
macro_rules! impl_udt_opt {
($(#[$x:meta])*
impl $name:ident: $ty:ty) => {
$(#[$x])*
pub struct $name;
impl ::UdtOption<$ty> for $name {
fn get_type() -> ::UDTOpt { ::UDTOpt::$name }
}
};
}
pub mod UdtOpts {
impl_udt_opt! {
impl UDT_MSS: i32
}
}
pub fn getopt<B, T: UdtOption<B>>(opt: T) -> B {
unimplemented!();
}
fn setopt<B, T: UdtOption<B>>(opt: T, val: B) {
unimplemented!();
}
fn main() {
let x: i32 = getopt(UdtOpts::UDT_MSS);
let y: bool = getopt(UdtOpts::UDT_SNDSYN);
setopt(UdtOpts::UDT_MAXBW, 10);
}