-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathAnyPath.swift
82 lines (71 loc) · 1.83 KB
/
AnyPath.swift
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//===--- AnyPath.swift ----------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 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 the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import ArgumentParser
import System
public enum AnyPath: PathProtocol, Sendable {
case relative(RelativePath)
case absolute(AbsolutePath)
public init<P: PathProtocol>(_ path: P) {
self = path.asAnyPath
}
public init(_ storage: FilePath) {
if storage.isAbsolute {
self = .absolute(.init(storage))
} else {
self = .relative(.init(storage))
}
}
public var storage: FilePath {
switch self {
case .relative(let r):
r.storage
case .absolute(let a):
a.storage
}
}
public var asAnyPath: AnyPath {
self
}
}
extension AnyPath {
public var absoluteInWorkingDir: AbsolutePath {
switch self {
case .relative(let r):
r.absoluteInWorkingDir
case .absolute(let a):
a
}
}
public func absolute(in base: AbsolutePath) -> AbsolutePath {
switch self {
case .relative(let r):
r.absolute(in: base)
case .absolute(let a):
a
}
}
}
extension AnyPath: Decodable {
public init(from decoder: Decoder) throws {
self.init(try decoder.singleValueContainer().decode(String.self))
}
}
extension AnyPath: ExpressibleByArgument {
public init(argument rawPath: String) {
self.init(rawPath)
}
}
extension StringProtocol {
func hasExtension(_ ext: FileExtension) -> Bool {
FilePath(String(self)).extension == ext.rawValue
}
}