Skip to content

Commit 1bb8036

Browse files
authored
Merge pull request #68 from Atypical-Consulting/features/events
Features/events
2 parents 88a5c10 + 35cf169 commit 1bb8036

File tree

189 files changed

+3352
-869
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

189 files changed

+3352
-869
lines changed

Atypical.VirtualFileSystem.DemoCli/Extensions/TreeExtensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// Copyright (c) 2022-2023, Atypical Consulting SRL
2+
// All rights reserved... but seriously, we're open to sharing if you ask nicely!
3+
//
4+
// This source code is licensed under the BSD-style license found in the
5+
// LICENSE file in the root directory of this source tree.
6+
17
using Atypical.VirtualFileSystem.Core.Contracts;
28
using Spectre.Console.Rendering;
39

@@ -33,7 +39,7 @@ private static Tree FillTree(this Tree treeNode, IDirectoryNode directoryNode)
3339
var tree = new Tree(file.Name);
3440
treeNode.AddNode(tree);
3541
}
36-
42+
3743
return treeNode;
3844
}
3945
}
Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
using Atypical.VirtualFileSystem.Core;
2+
using Atypical.VirtualFileSystem.Core.Contracts;
23
using Atypical.VirtualFileSystem.DemoCli.Extensions;
34

45
// Create a virtual file system
56
var factory = new VirtualFileSystemFactory();
67
var vfs = factory.CreateFileSystem();
78

9+
// Subscribe to VFS events
10+
SubscribeToVFSEvents(vfs);
11+
812
// Display a banner
913
AnsiConsole.Write(
1014
new FigletText("VFS Demo")
1115
.LeftJustified()
1216
.Color(Color.Gold1));
1317

1418
// Create a directory structure
19+
WriteSectionHeader("INITIAL DIRECTORY STRUCTURE");
20+
1521
vfs.CreateDirectory(new VFSDirectoryPath("/heroes"));
1622
vfs.CreateFile(new VFSFilePath("/heroes/ironman.txt"), "Tony Stark");
1723
vfs.CreateFile(new VFSFilePath("/heroes/captain_america.txt"), "Steve Rogers");
@@ -22,33 +28,71 @@
2228
vfs.CreateDirectory(new VFSDirectoryPath("/villains"));
2329
vfs.CreateFile(new VFSFilePath("/villains/loki.txt"), "Loki Laufeyson");
2430
vfs.CreateFile(new VFSFilePath("/villains/ultron.txt"), "Ultron");
25-
vfs.CreateFile(new VFSFilePath("/villains/killmonger.txt"), "N'Jadaka");
31+
vfs.CreateFile(new VFSFilePath("/villains/thanos.txt"), "Thanos");
2632

27-
AnsiConsole.WriteLine("Initial directory structure:");
28-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
29-
AnsiConsole.WriteLine();
33+
WriteTree(vfs);
3034

31-
AnsiConsole.WriteLine("Rename a file:");
35+
// Rename a file
36+
WriteSectionHeader("RENAME FILE");
3237
vfs.RenameFile(new VFSFilePath("/heroes/ironman.txt"), "tony_stark.txt");
33-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
34-
AnsiConsole.WriteLine();
38+
WriteTree(vfs);
3539

36-
AnsiConsole.WriteLine("Move a file:");
40+
// Move a file
41+
WriteSectionHeader("MOVE FILE");
3742
vfs.MoveFile(new VFSFilePath("/heroes/tony_stark.txt"), new VFSFilePath("/villains/tony_stark.txt"));
38-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
39-
AnsiConsole.WriteLine();
43+
WriteTree(vfs);
4044

41-
AnsiConsole.WriteLine("Delete a file:");
45+
// Delete a file
46+
WriteSectionHeader("DELETE FILE");
4247
vfs.DeleteFile(new VFSFilePath("/villains/tony_stark.txt"));
43-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
44-
AnsiConsole.WriteLine();
48+
WriteTree(vfs);
4549

46-
AnsiConsole.WriteLine("Delete a directory:");
50+
// Delete a directory
51+
WriteSectionHeader("DELETE DIRECTORY");
4752
vfs.DeleteDirectory(new VFSDirectoryPath("/villains"));
48-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
49-
AnsiConsole.WriteLine();
53+
WriteTree(vfs);
5054

51-
AnsiConsole.WriteLine("Move a directory:");
55+
// Move a directory
56+
WriteSectionHeader("MOVE DIRECTORY");
5257
vfs.MoveDirectory(new VFSDirectoryPath("/heroes"), new VFSDirectoryPath("/avengers"));
53-
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(vfs));
54-
AnsiConsole.WriteLine();
58+
WriteTree(vfs);
59+
60+
// Rename a directory
61+
// TODO: fix rename directory
62+
// WriteSectionHeader("RENAME DIRECTORY");
63+
// vfs.RenameDirectory(new VFSDirectoryPath("/avengers"), new VFSDirectoryPath("/heroes"));
64+
// WriteTree(vfs);
65+
return;
66+
67+
void SubscribeToVFSEvents(IVirtualFileSystem virtualFileSystem)
68+
{
69+
virtualFileSystem.DirectoryCreated += createdArgs => OnChange(virtualFileSystem, createdArgs);
70+
virtualFileSystem.FileCreated += createdArgs => OnChange(virtualFileSystem, createdArgs);
71+
virtualFileSystem.DirectoryDeleted += deletedArgs => OnChange(virtualFileSystem, deletedArgs);
72+
virtualFileSystem.FileDeleted += deletedArgs => OnChange(virtualFileSystem, deletedArgs);
73+
virtualFileSystem.DirectoryMoved += movedArgs => OnChange(virtualFileSystem, movedArgs);
74+
virtualFileSystem.FileMoved += movedArgs => OnChange(virtualFileSystem, movedArgs);
75+
virtualFileSystem.DirectoryRenamed += renamedArgs => OnChange(virtualFileSystem, renamedArgs);
76+
virtualFileSystem.FileRenamed += renamedArgs => OnChange(virtualFileSystem, renamedArgs);
77+
return;
78+
79+
static void OnChange(object? sender, VFSEventArgs args)
80+
{
81+
AnsiConsole.Write(new Markup($" - {args.MessageWithMarkup}"));
82+
AnsiConsole.WriteLine();
83+
}
84+
}
85+
86+
void WriteSectionHeader(string header = "")
87+
{
88+
AnsiConsole.Write(new Markup($"[underline yellow]{header}[/]"));
89+
AnsiConsole.WriteLine();
90+
AnsiConsole.WriteLine();
91+
}
92+
93+
void WriteTree(IVirtualFileSystem virtualFileSystem)
94+
{
95+
AnsiConsole.WriteLine();
96+
AnsiConsole.Write(new Tree("Marvel Universe").FillTree(virtualFileSystem));
97+
AnsiConsole.WriteLine();
98+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Copyright (c) 2022-2023, Atypical Consulting SRL
2+
// All rights reserved... but seriously, we're open to sharing if you ask nicely!
3+
//
4+
// This source code is licensed under the BSD-style license found in the
5+
// LICENSE file in the root directory of this source tree.
6+
7+
using Atypical.VirtualFileSystem.Core;
8+
using Atypical.VirtualFileSystem.Core.Contracts;
9+
10+
namespace Atypical.VirtualFileSystem.DemoCli.WIP;
11+
12+
public class FileSystemWatcher : IFileSystemWatcher
13+
{
14+
private readonly IVirtualFileSystem _fileSystem;
15+
private readonly Dictionary<VFSPath, DateTimeOffset> _lastModified;
16+
private readonly Timer _timer;
17+
private bool _isWatching;
18+
19+
public event Action<VFSPath>? OnChanged;
20+
21+
public FileSystemWatcher(IVirtualFileSystem fileSystem)
22+
{
23+
_fileSystem = fileSystem;
24+
_lastModified = new Dictionary<VFSPath, DateTimeOffset>();
25+
_timer = new Timer(CheckForChanges, null, Timeout.Infinite, Timeout.Infinite);
26+
27+
_fileSystem.FileCreated += OnFileCreated;
28+
// _fileSystem.FileDeleted += OnFileDeleted;
29+
_fileSystem.DirectoryCreated += OnDirectoryCreated;
30+
// _fileSystem.DirectoryDeleted += OnDirectoryDeleted;
31+
}
32+
33+
public void StartWatching()
34+
{
35+
_isWatching = true;
36+
_timer.Change(0, 1000); // Check for changes every second
37+
}
38+
39+
public void StopWatching()
40+
{
41+
_isWatching = false;
42+
_timer.Change(Timeout.Infinite, Timeout.Infinite);
43+
}
44+
45+
private void CheckForChanges(object? state)
46+
{
47+
if (!_isWatching) return;
48+
49+
var allNodes = _fileSystem.Directories.Cast<IVirtualFileSystemNode>().Concat(_fileSystem.Files);
50+
51+
foreach (var node in allNodes)
52+
{
53+
if (!_lastModified.TryGetValue(node.Path, out var lastModified) || lastModified < node.LastWriteTime)
54+
{
55+
_lastModified[node.Path] = node.LastWriteTime;
56+
OnChanged?.Invoke(node.Path);
57+
}
58+
}
59+
}
60+
61+
private void OnFileCreated(VFSFileCreatedArgs args)
62+
{
63+
var filePath = args.Path;
64+
_lastModified[filePath] = _fileSystem.GetFile(filePath).LastWriteTime;
65+
}
66+
67+
private void OnDirectoryCreated(VFSDirectoryCreatedArgs args)
68+
{
69+
var directoryPath = args.Path;
70+
_lastModified[directoryPath] = _fileSystem.GetDirectory(directoryPath).LastWriteTime;
71+
}
72+
73+
private void OnFileDeleted(VFSFilePath filePath)
74+
{
75+
_lastModified.Remove(filePath);
76+
}
77+
78+
private void OnDirectoryDeleted(VFSDirectoryPath directoryPath)
79+
{
80+
_lastModified.Remove(directoryPath);
81+
}
82+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) 2022-2023, Atypical Consulting SRL
2+
// All rights reserved... but seriously, we're open to sharing if you ask nicely!
3+
//
4+
// This source code is licensed under the BSD-style license found in the
5+
// LICENSE file in the root directory of this source tree.
6+
7+
using Atypical.VirtualFileSystem.Core;
8+
9+
namespace Atypical.VirtualFileSystem.DemoCli.WIP;
10+
11+
public interface IFileSystemWatcher
12+
{
13+
event Action<VFSPath> OnChanged;
14+
15+
void StartWatching();
16+
void StopWatching();
17+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2022-2023, Atypical Consulting SRL
2+
// All rights reserved... but seriously, we're open to sharing if you ask nicely!
3+
//
4+
// This source code is licensed under the BSD-style license found in the
5+
// LICENSE file in the root directory of this source tree.
6+
7+
namespace Atypical.VirtualFileSystem.DemoCli.WIP;
8+
9+
/// <summary>
10+
/// Represents a node type in a virtual file system.
11+
/// </summary>
12+
public enum VFSNodeType
13+
{
14+
/// <summary>
15+
/// The node is a directory.
16+
/// </summary>
17+
DIRECTORY,
18+
19+
/// <summary>
20+
/// The node is a file.
21+
/// </summary>
22+
FILE
23+
}

docs/api/DirectoryNode.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
Represents a directory in the virtual file system.
77

88
```csharp
9-
public class DirectoryNode : Atypical.VirtualFileSystem.Core.Abstractions.VFSNode,
9+
public class DirectoryNode : Atypical.VirtualFileSystem.Core.VFSNode,
1010
Atypical.VirtualFileSystem.Core.Contracts.IDirectoryNode,
1111
Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystemNode,
1212
System.IEquatable<Atypical.VirtualFileSystem.Core.DirectoryNode>
1313
```
1414

15-
Inheritance [System.Object](https://docs.microsoft.com/en-us/dotnet/api/System.Object 'System.Object') &#129106; [VFSNode](VFSNode.md 'Atypical.VirtualFileSystem.Core.Abstractions.VFSNode') &#129106; DirectoryNode
15+
Inheritance [System.Object](https://docs.microsoft.com/en-us/dotnet/api/System.Object 'System.Object') &#129106; [VFSNode](VFSNode.md 'Atypical.VirtualFileSystem.Core.VFSNode') &#129106; DirectoryNode
1616

1717
Derived
1818
&#8627; [RootNode](RootNode.md 'Atypical.VirtualFileSystem.Core.RootNode')

docs/api/FileNode.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
Represents a file in the virtual file system.
77

88
```csharp
9-
public class FileNode : Atypical.VirtualFileSystem.Core.Abstractions.VFSNode,
9+
public class FileNode : Atypical.VirtualFileSystem.Core.VFSNode,
1010
Atypical.VirtualFileSystem.Core.Contracts.IFileNode,
1111
Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystemNode,
1212
System.IEquatable<Atypical.VirtualFileSystem.Core.FileNode>
1313
```
1414

15-
Inheritance [System.Object](https://docs.microsoft.com/en-us/dotnet/api/System.Object 'System.Object') &#129106; [VFSNode](VFSNode.md 'Atypical.VirtualFileSystem.Core.Abstractions.VFSNode') &#129106; FileNode
15+
Inheritance [System.Object](https://docs.microsoft.com/en-us/dotnet/api/System.Object 'System.Object') &#129106; [VFSNode](VFSNode.md 'Atypical.VirtualFileSystem.Core.VFSNode') &#129106; FileNode
1616

1717
Implements [IFileNode](IFileNode.md 'Atypical.VirtualFileSystem.Core.Contracts.IFileNode'), [IVirtualFileSystemNode](IVirtualFileSystemNode.md 'Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystemNode'), [System.IEquatable&lt;](https://docs.microsoft.com/en-us/dotnet/api/System.IEquatable-1 'System.IEquatable`1')[FileNode](FileNode.md 'Atypical.VirtualFileSystem.Core.FileNode')[&gt;](https://docs.microsoft.com/en-us/dotnet/api/System.IEquatable-1 'System.IEquatable`1')
1818

docs/api/IVirtualFileSystem.CreateDirectory(VFSDirectoryPath).md renamed to docs/api/IVFSCreate.CreateDirectory(VFSDirectoryPath).md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#### [Atypical.VirtualFileSystem.Core](VirtualFileSystem.md 'VirtualFileSystem')
2-
### [Atypical.VirtualFileSystem.Core.Contracts](VirtualFileSystem.md#Atypical.VirtualFileSystem.Core.Contracts 'Atypical.VirtualFileSystem.Core.Contracts').[IVirtualFileSystem](IVirtualFileSystem.md 'Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem')
2+
### [Atypical.VirtualFileSystem.Core.Contracts](VirtualFileSystem.md#Atypical.VirtualFileSystem.Core.Contracts 'Atypical.VirtualFileSystem.Core.Contracts').[IVFSCreate](IVFSCreate.md 'Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate')
33

4-
## IVirtualFileSystem.CreateDirectory(VFSDirectoryPath) Method
4+
## IVFSCreate.CreateDirectory(VFSDirectoryPath) Method
55

66
Creates a directory node at the specified path.
77
The path must be absolute.
@@ -11,7 +11,7 @@ Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem CreateDirectory(Aty
1111
```
1212
#### Parameters
1313

14-
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem.CreateDirectory(Atypical.VirtualFileSystem.Core.VFSDirectoryPath).directoryPath'></a>
14+
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate.CreateDirectory(Atypical.VirtualFileSystem.Core.VFSDirectoryPath).directoryPath'></a>
1515

1616
`directoryPath` [VFSDirectoryPath](VFSDirectoryPath.md 'Atypical.VirtualFileSystem.Core.VFSDirectoryPath')
1717

docs/api/IVirtualFileSystem.CreateFile(VFSFilePath,string).md renamed to docs/api/IVFSCreate.CreateFile(VFSFilePath,string).md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#### [Atypical.VirtualFileSystem.Core](VirtualFileSystem.md 'VirtualFileSystem')
2-
### [Atypical.VirtualFileSystem.Core.Contracts](VirtualFileSystem.md#Atypical.VirtualFileSystem.Core.Contracts 'Atypical.VirtualFileSystem.Core.Contracts').[IVirtualFileSystem](IVirtualFileSystem.md 'Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem')
2+
### [Atypical.VirtualFileSystem.Core.Contracts](VirtualFileSystem.md#Atypical.VirtualFileSystem.Core.Contracts 'Atypical.VirtualFileSystem.Core.Contracts').[IVFSCreate](IVFSCreate.md 'Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate')
33

4-
## IVirtualFileSystem.CreateFile(VFSFilePath, string) Method
4+
## IVFSCreate.CreateFile(VFSFilePath, string) Method
55

66
Creates a file node at the specified path.
77
The path must be absolute.
@@ -11,13 +11,13 @@ Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem CreateFile(Atypical
1111
```
1212
#### Parameters
1313

14-
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem.CreateFile(Atypical.VirtualFileSystem.Core.VFSFilePath,string).filePath'></a>
14+
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate.CreateFile(Atypical.VirtualFileSystem.Core.VFSFilePath,string).filePath'></a>
1515

1616
`filePath` [VFSFilePath](VFSFilePath.md 'Atypical.VirtualFileSystem.Core.VFSFilePath')
1717

1818
The path of the file node.
1919

20-
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVirtualFileSystem.CreateFile(Atypical.VirtualFileSystem.Core.VFSFilePath,string).content'></a>
20+
<a name='Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate.CreateFile(Atypical.VirtualFileSystem.Core.VFSFilePath,string).content'></a>
2121

2222
`content` [System.String](https://docs.microsoft.com/en-us/dotnet/api/System.String 'System.String')
2323

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#### [Atypical.VirtualFileSystem.Core](VirtualFileSystem.md 'VirtualFileSystem')
2+
### [Atypical.VirtualFileSystem.Core.Contracts](VirtualFileSystem.md#Atypical.VirtualFileSystem.Core.Contracts 'Atypical.VirtualFileSystem.Core.Contracts').[IVFSCreate](IVFSCreate.md 'Atypical.VirtualFileSystem.Core.Contracts.IVFSCreate')
3+
4+
## IVFSCreate.DirectoryCreated Event
5+
6+
Event triggered when a directory is created.
7+
8+
```csharp
9+
event Action<VFSDirectoryCreatedArgs>? DirectoryCreated;
10+
```
11+
12+
#### Event Type
13+
[System.Action&lt;](https://docs.microsoft.com/en-us/dotnet/api/System.Action-1 'System.Action`1')[VFSDirectoryCreatedArgs](VFSDirectoryCreatedArgs.md 'Atypical.VirtualFileSystem.Core.VFSDirectoryCreatedArgs')[&gt;](https://docs.microsoft.com/en-us/dotnet/api/System.Action-1 'System.Action`1')

0 commit comments

Comments
 (0)