rsvim_core 0.1.3-alpha.2

The core library for RSVIM text editor.
Documentation
//! File resource.

use crate::js::resource::ResourceId;
use crate::js::resource::Resourcify;
use crate::prelude::*;
use std::fmt::Debug;
use std::sync::Arc;
use std::sync::Mutex;

#[derive(Clone)]
pub struct FileResource {
  id: ResourceId,
  data: Arc<Mutex<std::fs::File>>,
}

impl FileResource {
  pub fn new(data: std::fs::File) -> Self {
    Self {
      id: ResourceId::next(),
      data: Arc::new(Mutex::new(data)),
    }
  }

  pub fn data(&self) -> Arc<Mutex<std::fs::File>> {
    self.data.clone()
  }
}

impl Resourcify for FileResource {
  fn id(&self) -> ResourceId {
    self.id
  }
}

#[cfg(target_family = "windows")]
impl Debug for FileResource {
  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    use std::os::windows::io::AsHandle;
    f.debug_struct("FileResource")
      .field("id", &self.id)
      .field("as_handle", &lock!(self.data).as_handle())
      .finish()
  }
}

#[cfg(not(target_family = "windows"))]
impl Debug for FileResource {
  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    use std::os::fd::AsFd;
    f.debug_struct("FileResource")
      .field("id", &self.id)
      .field("as_fd", &lock!(self.data).as_fd())
      .finish()
  }
}