qubit_fs/metadata/
file_system_info.rs1use std::fmt::Display;
11
12use crate::error::FsResult;
13use crate::metadata::FileSystemId;
14use crate::metadata::NonSensitiveMetadata;
15use crate::metadata::UserMetadata;
16use crate::path::PathSemantics;
17use crate::path::Uri;
18
19#[derive(Clone, Debug, PartialEq)]
37pub struct FileSystemInfo {
38 id: FileSystemId,
40 provider_id: Box<str>,
42 schemes: Vec<String>,
44 path_semantics: PathSemantics,
46 provider_metadata: NonSensitiveMetadata,
48}
49
50impl FileSystemInfo {
51 #[inline]
53 #[must_use]
54 pub fn new(id: FileSystemId, provider_id: impl Display, path_semantics: PathSemantics) -> Self {
55 Self {
56 id,
57 provider_id: provider_id.to_string().into(),
58 schemes: Vec::new(),
59 path_semantics,
60 provider_metadata: NonSensitiveMetadata::new(),
61 }
62 }
63
64 pub fn with_scheme(mut self, scheme: &str) -> FsResult<Self> {
70 let scheme = Uri::parse(&format!("{scheme}:/"))?.scheme().to_owned();
71 if !self.schemes.contains(&scheme) {
72 self.schemes.push(scheme);
73 }
74 Ok(self)
75 }
76
77 #[inline]
83 #[must_use]
84 pub fn with_provider_metadata(mut self, metadata: UserMetadata) -> Self {
85 self.provider_metadata = NonSensitiveMetadata::from(metadata);
86 self
87 }
88
89 #[inline]
91 #[must_use]
92 pub const fn id(&self) -> &FileSystemId {
93 &self.id
94 }
95
96 #[inline]
98 #[must_use]
99 pub const fn provider_id(&self) -> &str {
100 &self.provider_id
101 }
102
103 #[inline]
105 #[must_use]
106 pub fn schemes(&self) -> &[String] {
107 &self.schemes
108 }
109
110 #[inline]
112 #[must_use]
113 pub const fn path_semantics(&self) -> PathSemantics {
114 self.path_semantics
115 }
116
117 #[inline]
119 #[must_use]
120 pub const fn provider_metadata(&self) -> &NonSensitiveMetadata {
121 &self.provider_metadata
122 }
123}
124
125#[cfg(test)]
126mod tests {
127 use super::FileSystemInfo;
128 use crate::metadata::FileSystemId;
129 use crate::metadata::UserMetadata;
130 use crate::path::PathSemantics;
131
132 #[test]
133 fn runtime_contract_covers_snapshot_accessors() {
134 let id = FileSystemId::new("file-system-info-test").expect("valid id");
135 let info = FileSystemInfo::new(id.clone(), "provider", PathSemantics::Hierarchical)
136 .with_scheme("file")
137 .expect("valid scheme")
138 .with_provider_metadata(UserMetadata::new());
139
140 assert_eq!(info.id(), &id);
141 assert_eq!(info.provider_id(), "provider");
142 assert_eq!(info.schemes(), &["file".to_owned()]);
143 assert_eq!(info.path_semantics(), PathSemantics::Hierarchical);
144 assert!(info.provider_metadata().is_empty());
145 }
146}