Skip to main content

Mountain/Environment/
FileSystemProvider.rs

1//! # FileSystemProvider (Environment)
2//!
3//! Implements [`FileSystemReader`](CommonLibrary::FileSystem::FileSystemReader)
4//! and [`FileSystemWriter`](CommonLibrary::FileSystem::FileSystemWriter) for
5//! `MountainEnvironment`, providing secure, validated filesystem access with
6//! workspace trust enforcement. Handles read, write, stat, delete, rename,
7//! copy, and directory traversal; detects symbolic links.
8//!
9//! ## Security model
10//!
11//! All operations call `Utility::PathSecurity::IsPathAllowedForAccess` before
12//! touching the filesystem. Access is sandboxed to registered workspace
13//! folders, path normalization blocks `../` traversal, and symbolic links
14//! outside the workspace are not followed.
15//!
16//! ## Implementation
17//!
18//! The trait impl is split across two sub-modules loaded via `#[path]`:
19//! - `FileSystemProvider/ReadOperations.rs` - `FileSystemReader` impl
20//! - `FileSystemProvider/WriteOperations.rs` - `FileSystemWriter` impl
21//!
22//! ## VS Code reference
23//!
24//! - `vs/workbench/services/files/electron-browser/diskFileSystemProvider.ts`
25//! - `vs/platform/files/common/files.ts`
26//! - `vs/base/common/network.ts`
27//!
28//! ## Planned Work
29//!
30//! - Filesystem change watching
31//! - Path normalization enforcement
32//! - Atomic writes via temp+rename
33//! - File permissions/ownership metadata
34//! - Extended attributes
35//! - Trash API (not delete)
36//! - Encoding detection
37//! - Case-sensitivity handling
38//! - Filesystem usage statistics
39//! - Metadata caching
40
41use std::path::PathBuf;
42
43use CommonLibrary::{
44	Error::CommonError::CommonError,
45	FileSystem::{
46		DTO::{FileSystemStatDTO::FileSystemStatDTO, FileTypeDTO::FileTypeDTO},
47		FileSystemReader::FileSystemReader,
48		FileSystemWriter::FileSystemWriter,
49	},
50};
51use async_trait::async_trait;
52
53use super::MountainEnvironment::MountainEnvironment;
54
55// Private submodules containing the actual implementation
56#[path = "FileSystemProvider/ReadOperations.rs"]
57mod ReadOperations;
58
59#[path = "FileSystemProvider/WriteOperations.rs"]
60mod WriteOperations;
61
62#[async_trait]
63impl FileSystemReader for MountainEnvironment {
64	/// Delegates to ReadOperations module
65	async fn ReadFile(&self, path:&PathBuf) -> Result<Vec<u8>, CommonError> {
66		ReadOperations::read_file_impl(self, path).await
67	}
68
69	/// Delegates to ReadOperations module
70	async fn StatFile(&self, path:&PathBuf) -> Result<FileSystemStatDTO, CommonError> {
71		ReadOperations::stat_file_impl(self, path).await
72	}
73
74	/// Delegates to ReadOperations module
75	async fn ReadDirectory(&self, path:&PathBuf) -> Result<Vec<(String, FileTypeDTO)>, CommonError> {
76		ReadOperations::read_directory_impl(self, path).await
77	}
78}
79
80#[async_trait]
81impl FileSystemWriter for MountainEnvironment {
82	/// Delegates to WriteOperations module
83	async fn WriteFile(&self, path:&PathBuf, content:Vec<u8>, create:bool, overwrite:bool) -> Result<(), CommonError> {
84		WriteOperations::write_file_impl(self, path, content, create, overwrite).await
85	}
86
87	/// Delegates to WriteOperations module
88	async fn CreateDirectory(&self, path:&PathBuf, recursive:bool) -> Result<(), CommonError> {
89		WriteOperations::create_directory_impl(self, path, recursive).await
90	}
91
92	/// Delegates to WriteOperations module
93	async fn Delete(&self, path:&PathBuf, recursive:bool, use_trash:bool) -> Result<(), CommonError> {
94		WriteOperations::delete_impl(self, path, recursive, use_trash).await
95	}
96
97	/// Delegates to WriteOperations module
98	async fn Rename(&self, source:&PathBuf, target:&PathBuf, overwrite:bool) -> Result<(), CommonError> {
99		WriteOperations::rename_impl(self, source, target, overwrite).await
100	}
101
102	/// Delegates to WriteOperations module
103	async fn Copy(&self, source:&PathBuf, target:&PathBuf, overwrite:bool) -> Result<(), CommonError> {
104		WriteOperations::copy_impl(self, source, target, overwrite).await
105	}
106
107	/// Delegates to WriteOperations module
108	async fn CreateFile(&self, path:&PathBuf) -> Result<(), CommonError> {
109		WriteOperations::create_file_impl(self, path).await
110	}
111}