use std::time::SystemTime;
use crate::metadata::Checksum;
use crate::metadata::FileKind;
use crate::metadata::NonSensitiveMetadata;
use crate::metadata::ResourceVersion;
use crate::metadata::UserMetadata;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq)]
pub struct FileMetadata {
kind: FileKind,
len: Option<u64>,
modified_at: Option<SystemTime>,
created_at: Option<SystemTime>,
accessed_at: Option<SystemTime>,
etag: Option<ResourceVersion>,
content_type: Option<String>,
checksum: Option<Checksum>,
user_metadata: NonSensitiveMetadata,
provider_metadata: NonSensitiveMetadata,
}
impl FileMetadata {
#[inline]
#[must_use]
pub fn new(kind: FileKind) -> Self {
Self {
kind,
len: None,
modified_at: None,
created_at: None,
accessed_at: None,
etag: None,
content_type: None,
checksum: None,
user_metadata: NonSensitiveMetadata::new(),
provider_metadata: NonSensitiveMetadata::new(),
}
}
#[inline]
#[must_use]
pub const fn kind(&self) -> &FileKind {
&self.kind
}
#[inline]
#[must_use]
pub const fn len(&self) -> Option<u64> {
self.len
}
#[inline]
#[must_use]
pub const fn is_empty(&self) -> bool {
matches!(self.len, Some(0))
}
#[inline]
#[must_use]
pub const fn modified_at(&self) -> Option<SystemTime> {
self.modified_at
}
#[inline]
#[must_use]
pub const fn created_at(&self) -> Option<SystemTime> {
self.created_at
}
#[inline]
#[must_use]
pub const fn accessed_at(&self) -> Option<SystemTime> {
self.accessed_at
}
#[inline]
#[must_use]
pub const fn etag(&self) -> Option<&ResourceVersion> {
self.etag.as_ref()
}
#[inline]
#[must_use]
pub fn content_type(&self) -> Option<&str> {
self.content_type.as_deref()
}
#[inline]
#[must_use]
pub const fn checksum(&self) -> Option<&Checksum> {
self.checksum.as_ref()
}
#[inline]
#[must_use]
pub const fn user_metadata(&self) -> &NonSensitiveMetadata {
&self.user_metadata
}
#[inline]
#[must_use]
pub const fn provider_metadata(&self) -> &NonSensitiveMetadata {
&self.provider_metadata
}
#[inline]
#[must_use]
pub fn with_kind(mut self, kind: FileKind) -> Self {
self.kind = kind;
self
}
#[inline]
#[must_use]
pub fn with_len(mut self, len: Option<u64>) -> Self {
self.len = len;
self
}
#[inline]
#[must_use]
pub fn with_modified_at(mut self, value: Option<SystemTime>) -> Self {
self.modified_at = value;
self
}
#[inline]
#[must_use]
pub fn with_created_at(mut self, value: Option<SystemTime>) -> Self {
self.created_at = value;
self
}
#[inline]
#[must_use]
pub fn with_accessed_at(mut self, value: Option<SystemTime>) -> Self {
self.accessed_at = value;
self
}
#[inline]
#[must_use]
pub fn with_etag(mut self, value: Option<ResourceVersion>) -> Self {
self.etag = value;
self
}
#[inline]
#[must_use]
pub fn with_content_type(mut self, value: Option<String>) -> Self {
self.content_type = value;
self
}
#[inline]
#[must_use]
pub fn with_checksum(mut self, value: Option<Checksum>) -> Self {
self.checksum = value;
self
}
#[inline]
#[must_use]
pub fn with_user_metadata(mut self, metadata: UserMetadata) -> Self {
self.user_metadata = NonSensitiveMetadata::from(metadata);
self
}
#[inline]
#[must_use]
pub fn with_provider_metadata(mut self, metadata: UserMetadata) -> Self {
self.provider_metadata = NonSensitiveMetadata::from(metadata);
self
}
#[inline]
#[must_use]
pub fn is_directory_like(&self) -> bool {
matches!(self.kind, FileKind::Directory | FileKind::Prefix)
}
#[inline]
#[must_use]
pub fn is_file_like(&self) -> bool {
matches!(self.kind, FileKind::File | FileKind::Object)
}
}