rustcord 0.2.0

A safe wrapper around the Discord Rich Presence API
Documentation
use crate::join_request::{JoinRequestReply, User};
use crate::EventHandlers;
use libc;
use rustcord_sys as sys;
use std::ffi::CStr;

pub(crate) unsafe extern "C" fn ready_wrapper<EH: EventHandlers>(
    discord_user: *const sys::DiscordUser,
) {
    let user = User {
        user_id: CStr::from_ptr((*discord_user).userId)
            .to_string_lossy()
            .into_owned(),
        username: CStr::from_ptr((*discord_user).username)
            .to_string_lossy()
            .into_owned(),
        discriminator: CStr::from_ptr((*discord_user).discriminator)
            .to_string_lossy()
            .into_owned(),
        avatar: CStr::from_ptr((*discord_user).avatar)
            .to_string_lossy()
            .into_owned(),
    };
    EH::ready(user);
}

pub(crate) unsafe extern "C" fn disconnected_wrapper<EH: EventHandlers>(
    errcode: libc::c_int,
    message: *const libc::c_char,
) {
    EH::disconnected(errcode as i32, &CStr::from_ptr(message).to_string_lossy());
}

pub(crate) unsafe extern "C" fn errored_wrapper<EH: EventHandlers>(
    errcode: libc::c_int,
    message: *const libc::c_char,
) {
    EH::errored(errcode as i32, &CStr::from_ptr(message).to_string_lossy());
}

pub(crate) unsafe extern "C" fn join_game_wrapper<EH: EventHandlers>(secret: *const libc::c_char) {
    EH::join_game(&CStr::from_ptr(secret).to_string_lossy());
}

pub(crate) unsafe extern "C" fn spectate_game_wrapper<EH: EventHandlers>(
    secret: *const libc::c_char,
) {
    EH::spectate_game(&CStr::from_ptr(secret).to_string_lossy());
}

pub(crate) unsafe extern "C" fn join_request_wrapper<EH: EventHandlers>(
    discord_user: *const sys::DiscordUser,
) {
    let req = User {
        user_id: CStr::from_ptr((*discord_user).userId)
            .to_string_lossy()
            .into_owned(),
        username: CStr::from_ptr((*discord_user).username)
            .to_string_lossy()
            .into_owned(),
        discriminator: CStr::from_ptr((*discord_user).discriminator)
            .to_string_lossy()
            .into_owned(),
        avatar: CStr::from_ptr((*discord_user).avatar)
            .to_string_lossy()
            .into_owned(),
    };
    EH::join_request(req, |reply| {
        sys::Discord_Respond(
            (*discord_user).userId,
            match reply {
                JoinRequestReply::No => sys::DISCORD_REPLY_NO,
                JoinRequestReply::Yes => sys::DISCORD_REPLY_YES,
                JoinRequestReply::Ignore => sys::DISCORD_REPLY_IGNORE,
            } as libc::c_int,
        );
    });
}