Skip to main content

qubit_fs/metadata/
file_metadata.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10//! File metadata model.
11
12use std::time::SystemTime;
13
14use qubit_metadata::Metadata;
15
16use crate::{
17    Checksum,
18    FileKind,
19};
20
21/// Stable and extensible metadata for one filesystem resource.
22#[derive(Clone, Debug, PartialEq)]
23pub struct FileMetadata {
24    /// Provider-neutral resource kind.
25    pub kind: FileKind,
26    /// Byte length when known.
27    pub len: Option<u64>,
28    /// Last modification time when known.
29    pub modified_at: Option<SystemTime>,
30    /// Creation time when known.
31    pub created_at: Option<SystemTime>,
32    /// Last access time when known.
33    pub accessed_at: Option<SystemTime>,
34    /// Provider version or HTTP-style ETag when known.
35    pub etag: Option<String>,
36    /// Content type when known.
37    pub content_type: Option<String>,
38    /// Content checksum when known.
39    pub checksum: Option<Checksum>,
40    /// User-defined metadata.
41    pub user_metadata: Metadata,
42    /// Provider-native metadata.
43    pub provider_metadata: Metadata,
44}
45
46impl FileMetadata {
47    /// Creates metadata with only a file kind.
48    ///
49    /// # Parameters
50    /// - `kind`: Provider-neutral resource kind.
51    ///
52    /// # Returns
53    /// Metadata value with unknown optional fields.
54    #[inline]
55    #[must_use]
56    pub fn new(kind: FileKind) -> Self {
57        Self {
58            kind,
59            len: None,
60            modified_at: None,
61            created_at: None,
62            accessed_at: None,
63            etag: None,
64            content_type: None,
65            checksum: None,
66            user_metadata: Metadata::new(),
67            provider_metadata: Metadata::new(),
68        }
69    }
70
71    /// Tells whether this metadata describes a directory-like resource.
72    ///
73    /// # Returns
74    /// `true` for directories and prefixes.
75    #[inline]
76    #[must_use]
77    pub fn is_directory_like(&self) -> bool {
78        matches!(self.kind, FileKind::Directory | FileKind::Prefix)
79    }
80}