radb 0.1.7

A Rust Implement Python AdbUtils
Documentation
use anyhow::{anyhow, Result};
use chrono::Utc;
use std::convert::TryInto;

#[derive(Debug, PartialEq, PartialOrd, Ord, Eq)]
pub struct FileInfo {
    pub mode: u32,
    pub size: u32,
    pub mtime: u32,
    pub mdtime: Option<chrono::DateTime<Utc>>,
    pub path: String,
}

pub fn parse_file_info<T: ToString>(data: Vec<u8>, path: T) -> Result<FileInfo> {
    let mode_bytes = &data[0..4];
    let size_bytes = &data[4..8];
    let mtime_bytes = &data[8..12];

    let mode = u32::from_le_bytes(mode_bytes.try_into()?);
    let size = u32::from_le_bytes(size_bytes.try_into()?);
    let mtime = u32::from_le_bytes(mtime_bytes.try_into()?);
    let mdtime = Some(
        chrono::DateTime::<Utc>::from_timestamp(mtime as i64, 0)
            .ok_or(anyhow!("Parse Datetime Error"))?,
    );

    Ok(FileInfo::new(mode, size, mtime, mdtime, path.to_string()))
}

impl FileInfo {
    fn new(
        mode: u32,
        size: u32,
        mtime: u32,
        mdtime: Option<chrono::DateTime<Utc>>,
        path: String,
    ) -> FileInfo {
        FileInfo {
            mode,
            size,
            mtime,
            mdtime,
            path,
        }
    }
}