mod client;
pub mod commands;
pub mod responses;
mod server;

use std::path::{Path, PathBuf};
use tracing::warn;

pub use commands::*;
pub use responses::Response;

#[derive(Debug)]
pub struct Ipc {
    path: PathBuf,
}

impl Ipc {
    /// Creates a new IPC instance.
    /// This can be used as both a server and client.
    pub fn new() -> Self {
        let ipc_socket_file = std::env::var("XDG_RUNTIME_DIR")
            .map_or_else(|_| PathBuf::from("/tmp"), PathBuf::from)
            .join("ironbar-ipc.sock");

        if format!("{}", ipc_socket_file.display()).len() > 100 {
            warn!(
                "The IPC socket file's absolute path exceeds 100 bytes, the socket may fail to create."
            );
        }

        Self {
            path: ipc_socket_file,
        }
    }

    pub fn path(&self) -> &Path {
        self.path.as_path()
    }
}
