cord-nvim 2.0.0-beta.34

🚀 The most extensible Discord Rich Presence plugin for Neovim, powered by Rust.
use super::activity::Activity;
use crate::protocol::json;

pub struct Packet<'a> {
    pub cmd: &'a str,
    pub args: PacketArgs<'a>,
}

pub struct PacketArgs<'a> {
    pub pid: u32,
    pub activity: Option<&'a Activity>,
}

impl<'a> Packet<'a> {
    pub fn new(pid: u32, activity: Option<&'a Activity>) -> Self {
        Self {
            cmd: "SET_ACTIVITY",
            args: PacketArgs { pid, activity },
        }
    }

    pub fn empty() -> Self {
        Self {
            cmd: "SET_ACTIVITY",
            args: PacketArgs {
                pid: 0,
                activity: None,
            },
        }
    }
}

impl json::Serialize for Packet<'_> {
    fn serialize<'a>(
        &'a self,
        f: json::SerializeFn<'a>,
        state: &mut json::SerializeState,
    ) -> crate::Result<()> {
        f("cmd", json::ValueRef::String(self.cmd), state)?;
        f("args", json::ValueRef::Object(&self.args), state)?;
        f("nonce", json::ValueRef::String("-"), state)?;

        Ok(())
    }
}

impl json::Serialize for PacketArgs<'_> {
    fn serialize<'a>(
        &'a self,
        f: json::SerializeFn<'a>,
        state: &mut json::SerializeState,
    ) -> crate::Result<()> {
        f("pid", json::ValueRef::Number(self.pid as f64), state)?;
        if let Some(activity) = &self.activity {
            f("activity", json::ValueRef::Object(*activity), state)?;
        }

        Ok(())
    }
}