use std::path::Path;
use std::time::UNIX_EPOCH;
use kbolt_types::{FileError, KboltError};
use sha2::{Digest, Sha256};
use crate::Result;
pub(super) fn modified_token(metadata: &std::fs::Metadata) -> Result<String> {
let modified = metadata.modified()?;
let duration = modified.duration_since(UNIX_EPOCH).map_err(|_| {
KboltError::Internal("file modified timestamp predates unix epoch".to_string())
})?;
Ok(duration.as_nanos().to_string())
}
pub(super) fn sha256_hex(bytes: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(bytes);
format!("{:x}", hasher.finalize())
}
pub(super) fn file_title(path: &Path) -> String {
path.file_name()
.and_then(|item| item.to_str())
.map(ToString::to_string)
.unwrap_or_else(|| path.to_string_lossy().into_owned())
}
pub(super) fn display_title(title: Option<&str>, path: &str) -> String {
title
.map(str::trim)
.filter(|title| !title.is_empty())
.map(ToString::to_string)
.unwrap_or_else(|| file_title(Path::new(path)))
}
pub(super) fn file_error(path: Option<std::path::PathBuf>, error: String) -> FileError {
FileError {
path: path
.map(|item| item.to_string_lossy().into_owned())
.unwrap_or_else(|| "<unknown>".to_string()),
error,
}
}