webc 6.0.0-alpha1

WebContainer implementation for wapm.io
Documentation
use std::time::SystemTime;

use bytes::BytesMut;

use crate::since_epoch;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Timestamps {
    pub accessed: SystemTime,
    pub modified: SystemTime,
    pub created: SystemTime,
}

impl Default for Timestamps {
    fn default() -> Self {
        Self {
            accessed: SystemTime::UNIX_EPOCH,
            modified: SystemTime::UNIX_EPOCH,
            created: SystemTime::UNIX_EPOCH,
        }
    }
}

impl Timestamps {
    pub fn from_metadata(metadata: &std::fs::Metadata) -> Result<Timestamps, std::io::Error> {
        let accessed = metadata.accessed()?;
        let modified = metadata.modified()?;
        let created = metadata.created()?;

        Ok(Timestamps {
            accessed,
            modified,
            created,
        })
    }

    pub(crate) fn write_to(&self, buf: &mut BytesMut) -> Result<(), std::io::Error> {
        let accessed = since_epoch(self.accessed)?;
        let modified = since_epoch(self.modified)?;
        let created = since_epoch(self.created)?;

        buf.extend(accessed.as_secs().to_le_bytes());
        buf.extend(modified.as_secs().to_le_bytes());
        buf.extend(created.as_secs().to_le_bytes());

        Ok(())
    }
}

impl From<Timestamps> for crate::Timestamps {
    fn from(value: Timestamps) -> Self {
        let accessed = since_epoch(value.accessed).unwrap();
        let modified = since_epoch(value.modified).unwrap();
        let created = since_epoch(value.created).unwrap();

        crate::Timestamps {
            accessed: accessed.as_nanos() as u64,
            modified: modified.as_nanos() as u64,
            created: created.as_nanos() as u64,
        }
    }
}