aboutsummaryrefslogtreecommitdiff
path: root/bindings/c/src/data_c/connection_message_c.rs
blob: b3b54d4db88e5e52bcf49b7dfc5052cd3f6c782f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use crate::data_c::connection_message_c::ConnMsgCTag::{Connection, Ready, RequestLayoutConfigure, RequestProfile, RequestSkinPackage};
use std::ffi::c_void;
use std::mem::ManuallyDrop;
use std::ptr::null_mut;
use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::ConnectionMessage;
use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;

#[repr(C)]
#[allow(unused_imports)]
pub struct ConnectionMessageC {
    pub tag: ConnMsgCTag,
    pub data: ConnMsgCUnion
}

#[repr(C)]
#[allow(unused_imports)]
pub enum ConnMsgCTag {
    Connection, RequestProfile, RequestLayoutConfigure, RequestSkinPackage, Ready, Err
}

#[repr(C)]
#[allow(unused_imports)]
pub union ConnMsgCUnion {
    nul: *mut c_void,
    info: ManuallyDrop<PlayerInfo>
}

impl From<ConnectionMessageC> for ConnectionMessage {
    fn from(mut value: ConnectionMessageC) -> Self {
        match value.tag {
            Connection => unsafe {
                let info = ManuallyDrop::take(&mut value.data.info);
                ConnectionMessage::Connection(info)
            }
            RequestProfile => {
                ConnectionMessage::RequestProfile
            }
            RequestLayoutConfigure => {
                ConnectionMessage::RequestLayoutConfigure
            }
            RequestSkinPackage => {
                ConnectionMessage::RequestSkinPackage
            }
            Ready => {
                ConnectionMessage::Ready
            }
            ConnMsgCTag::Err => {
                ConnectionMessage::Err
            }
        }
    }
}

impl From<ConnectionMessage> for ConnectionMessageC {
    fn from(value: ConnectionMessage) -> Self {
        match value {
            ConnectionMessage::Connection(info) => {
                ConnectionMessageC {
                    tag: Connection,
                    data: ConnMsgCUnion { info: ManuallyDrop::new(info) }
                }
            }
            ConnectionMessage::RequestProfile => {
                ConnectionMessageC {
                    tag: RequestProfile,
                    data: ConnMsgCUnion { nul: null_mut() }
                }
            }
            ConnectionMessage::RequestLayoutConfigure => {
                ConnectionMessageC {
                    tag: RequestLayoutConfigure,
                    data: ConnMsgCUnion { nul: null_mut() }
                }
            }
            ConnectionMessage::RequestSkinPackage => {
                ConnectionMessageC {
                    tag: RequestSkinPackage,
                    data: ConnMsgCUnion { nul: null_mut() }
                }
            }
            ConnectionMessage::Ready => {
                ConnectionMessageC {
                    tag: Ready,
                    data: ConnMsgCUnion { nul: null_mut() }
                }
            }
            ConnectionMessage::Err => {
                ConnectionMessageC {
                    tag: ConnMsgCTag::Err,
                    data: ConnMsgCUnion { nul: null_mut() }
                }
            }
        }
    }
}