File: URLArgumentValidator.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 (81 lines) | stat: -rw-r--r-- 3,712 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 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 ArgumentParser
import Foundation

/// Simplifies validation of URL command-line arguments.
enum URLArgumentValidator {
    /// If a non-optional URL value is provided, validates that the URL represents a directory that exists.
    ///
    /// ### Example Error Message
    /// Invalid path provided via `[argumentDescription]`. No directory exists at '`[path]`'.
    ///
    /// - Parameter url: An optional URL value to be validated.
    /// - Parameter argumentDescription: A description of the command line argument or environment
    /// variable this URL was initialized from.
    ///
    /// - Throws: A `ValidationError` that includes the `argumentDescription` and current path.
    static func validateHasDirectoryPath(_ url: URL?, forArgumentDescription argumentDescription: String) throws {
        // Validation is only necessary if a non-optional value has been passed.
        guard let url else { return }
        
        guard url.hasDirectoryPath && FileManager.default.fileExists(atPath: url.path) else {
            throw ValidationError(
                """
                Invalid path provided via the \(argumentDescription). No directory exists at '\(url.path)'.
                """)
        }
    }

    /// If a non-optional URL value is provided, validates that the URL represents a file that exists.
    ///
    /// ### Example Error Message
    /// Invalid path provided via `[argumentDescription]`. No file exists at '`[path]`'.
    ///
    /// - Parameter url: An optional URL value to be validated.
    /// - Parameter argumentDescription: A description of the command line argument or environment
    /// variable this URL was initialized from.
    ///
    /// - Throws: A `ValidationError` that includes the `argumentDescription` and current path.
    static func validateFileExists(_ url: URL?, forArgumentDescription argumentDescription: String) throws {
        // Validation is only necessary if a non-optional value has been passed.
        guard let url else { return }
        
        guard FileManager.default.fileExists(atPath: url.path) else {
            throw ValidationError(
                """
                Invalid path provided via the \(argumentDescription). No file exists at '\(url.path)'.
                """)
        }
    }

    /// If a non-optional URL value is provided, validates that the URL represents an executable that exists.
    ///
    /// ### Example Error Message
    /// Invalid path provided via `[argumentDescription]`. Unable to execute file at '`[path]`'.
    ///
    /// - Parameter url: An optional URL value to be validated.
    /// - Parameter argumentDescription: A description of the command line argument or environment
    /// variable this URL was initialized from.
    ///
    /// - Throws: A `ValidationError` that includes the `argumentDescription` and current path.
    static func validateIsExecutableFile(_ url: URL?, forArgumentDescription argumentDescription: String) throws {
        // Validation is only necessary if a non-optional value has been passed.
        guard let url else { return }
        
        guard FileManager.default.isExecutableFile(atPath: url.path) else {
            throw ValidationError(
                """
                Invalid path provided via the \(argumentDescription). Unable to execute file at '\(url.path)'.
                """)
        }
    }
}