mpdclient 0.2.0

Rust interface to MPD using libmpdclient
Documentation
use std::{
    ffi::CStr,
    path::PathBuf,
    time::{Duration, SystemTime, UNIX_EPOCH},
};

use mpdclient_sys::{mpd_directory, mpd_directory_get_last_modified, mpd_directory_get_path};

/// Directory in MPD database which can contain more entities.
#[derive(Debug)]
pub struct Directory {
    inner: *mut mpd_directory,
}

impl Directory {
    pub(super) fn new(mpd_directory: *mut mpd_directory) -> Self {
        Self {
            inner: mpd_directory,
        }
    }

    /// Returns the path in the database of MPD.
    #[must_use]
    pub fn path(&self) -> PathBuf {
        let path = unsafe {
            let ptr = mpd_directory_get_path(self.inner);
            CStr::from_ptr(ptr).to_string_lossy().to_string()
        };
        PathBuf::from(path)
    }

    /// Returns the time the directory was last modified.
    // allow because it should be correct in the c library
    #[allow(clippy::cast_sign_loss)]
    #[must_use]
    pub fn last_modified(&self) -> Option<SystemTime> {
        let time = unsafe { mpd_directory_get_last_modified(self.inner) };
        if time == 0 {
            None
        } else {
            Some(UNIX_EPOCH + Duration::from_secs(time as u64))
        }
    }
}

unsafe impl Send for Directory {}