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}