use std::fmt::Display;
use crate::error::FsResult;
use crate::metadata::FileSystemId;
use crate::metadata::NonSensitiveMetadata;
use crate::metadata::UserMetadata;
use crate::path::PathSemantics;
use crate::path::Uri;
#[derive(Clone, Debug, PartialEq)]
pub struct FileSystemInfo {
id: FileSystemId,
provider_id: Box<str>,
schemes: Vec<String>,
path_semantics: PathSemantics,
provider_metadata: NonSensitiveMetadata,
}
impl FileSystemInfo {
#[inline]
#[must_use]
pub fn new(id: FileSystemId, provider_id: impl Display, path_semantics: PathSemantics) -> Self {
Self {
id,
provider_id: provider_id.to_string().into(),
schemes: Vec::new(),
path_semantics,
provider_metadata: NonSensitiveMetadata::new(),
}
}
pub fn with_scheme(mut self, scheme: &str) -> FsResult<Self> {
let scheme = Uri::parse(&format!("{scheme}:/"))?.scheme().to_owned();
if !self.schemes.contains(&scheme) {
self.schemes.push(scheme);
}
Ok(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 const fn id(&self) -> &FileSystemId {
&self.id
}
#[inline]
#[must_use]
pub const fn provider_id(&self) -> &str {
&self.provider_id
}
#[inline]
#[must_use]
pub fn schemes(&self) -> &[String] {
&self.schemes
}
#[inline]
#[must_use]
pub const fn path_semantics(&self) -> PathSemantics {
self.path_semantics
}
#[inline]
#[must_use]
pub const fn provider_metadata(&self) -> &NonSensitiveMetadata {
&self.provider_metadata
}
}
#[cfg(test)]
mod tests {
use super::FileSystemInfo;
use crate::metadata::FileSystemId;
use crate::metadata::UserMetadata;
use crate::path::PathSemantics;
#[test]
fn runtime_contract_covers_snapshot_accessors() {
let id = FileSystemId::new("file-system-info-test").expect("valid id");
let info = FileSystemInfo::new(id.clone(), "provider", PathSemantics::Hierarchical)
.with_scheme("file")
.expect("valid scheme")
.with_provider_metadata(UserMetadata::new());
assert_eq!(info.id(), &id);
assert_eq!(info.provider_id(), "provider");
assert_eq!(info.schemes(), &["file".to_owned()]);
assert_eq!(info.path_semantics(), PathSemantics::Hierarchical);
assert!(info.provider_metadata().is_empty());
}
}