CommandLineToolkit
36 строк · 878.0 Байт
1import Foundation
2
3private func inShellBlacklist(_ codeUnit: UInt8) -> Bool {
4switch codeUnit {
5case UInt8(ascii: "a")...UInt8(ascii: "z"),
6UInt8(ascii: "A")...UInt8(ascii: "Z"),
7UInt8(ascii: "0")...UInt8(ascii: "9"),
8UInt8(ascii: "-"),
9UInt8(ascii: "_"),
10UInt8(ascii: "/"),
11UInt8(ascii: ":"),
12UInt8(ascii: "@"),
13UInt8(ascii: "%"),
14UInt8(ascii: "+"),
15UInt8(ascii: "="),
16UInt8(ascii: "."),
17UInt8(ascii: ","):
18return false
19default:
20return true
21}
22}
23
24extension StringProtocol {
25public func shellEscaped() -> Self {
26if isEmpty {
27return "''"
28}
29
30if utf8.contains(where: inShellBlacklist) {
31return "'\(self.replacingOccurrences(of: "'", with: "'\\''"))'"
32}
33
34return self
35}
36}
37