use crate::DeviceInfo;
use crate::Request;
use crate::Topology;
use nix::errno::Errno;
use std::fs::OpenOptions;
use std::io;
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
use std::path::Path;
pub struct Media {
fd: OwnedFd,
}
impl AsFd for Media {
fn as_fd(&self) -> BorrowedFd {
self.fd.as_fd()
}
}
impl AsRawFd for Media {
fn as_raw_fd(&self) -> RawFd {
self.fd.as_raw_fd()
}
}
impl Media {
pub fn open<P: AsRef<Path>>(filename: P) -> io::Result<Media> {
let file = OpenOptions::new().read(true).write(true).open(filename)?;
let fd = file.into();
Ok(Media { fd })
}
pub fn device_info(&self) -> Result<DeviceInfo, Errno> {
DeviceInfo::from_media(self)
}
pub fn get_topology(&self) -> Result<Topology, Errno> {
Topology::from_media(self)
}
pub fn request_alloc(&self) -> Result<Request, Errno> {
Request::from_media(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! assert_size (
($t:ty, $sz:expr) => (
assert_eq!(::std::mem::size_of::<$t>(), $sz);
);
);
#[test]
fn size() {
assert_size!(Media, 4);
}
}