File: FileSystemProvider.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (64 lines) | stat: -rw-r--r-- 1,877 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See https://swift.org/LICENSE.txt for license information
 See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

import Foundation

/// A type that vends a tree of virtual filesystem objects.
public protocol FileSystemProvider {
    /// The organization of the files that this provider provides.
    var fileSystem: FSNode { get }
}

/// An element in a virtual filesystem.
public enum FSNode {
    /// A file in a filesystem.
    case file(File)
    /// A directory in a filesystem.
    case directory(Directory)
    
    /// A file in a virtual file system
    public struct File {
        /// The URL to this file.
        public var url: URL
        
        /// Creates a new virtual file with a given URL
        /// - Parameter url: The URL to this file.
        public init(url: URL) {
            self.url = url
        }
    }
    
    /// A directory in a virtual file system.
    public struct Directory {
        /// The URL to this directory.
        public var url: URL
        /// The contents of this directory.
        public var children: [FSNode]
        
        /// Creates a new virtual directory with a given URL and contents.
        /// - Parameters:
        ///   - url: The URL to this directory.
        ///   - children: The contents of this directory.
        public init(url: URL, children: [FSNode]) {
            self.url = url
            self.children = children
        }
    }
    
    /// The URL for the node in the filesystem.
    public var url: URL {
        switch self {
        case .file(let file):
            return file.url
        case .directory(let directory):
            return directory.url
        }
    }
}