File: DocumentationArchiveOption.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 (56 lines) | stat: -rw-r--r-- 2,038 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
/*
 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

/// Resolves and validates a URL value that provides the path to a documentation archive.
public struct DocCArchiveOption: DirectoryPathOption {

    public init(){}

    /// The name of the command line argument used to specify a source archive path.
    static let argumentValueName = "source-archive-path"
    static let expectedContent: Set<String> = ["data"]

    /// The path to an archive to be used by DocC.
    @Argument(
        help: ArgumentHelp(
            "Path to the DocC Archive ('.doccarchive') that should be processed.",
            valueName: argumentValueName),
        transform: URL.init(fileURLWithPath:))
    public var url: URL?

    public mutating func validate() throws {

        // Validate that the URL represents a directory
        guard urlOrFallback.hasDirectoryPath else {
            throw ValidationError("'\(urlOrFallback.path)' is not a valid DocC Archive. Expected a directory but a path to a file was provided")
        }
        
        var archiveContents: [String]
        do {
            archiveContents = try FileManager.default.contentsOfDirectory(atPath: urlOrFallback.path)
        } catch {
            throw ValidationError("'\(urlOrFallback.path)' is not a valid DocC Archive: \(error)")
        }
        
        let missingContents = Array(Set(DocCArchiveOption.expectedContent).subtracting(archiveContents))
        guard missingContents.isEmpty else {
            throw ValidationError(
                """
                '\(urlOrFallback.path)' is not a valid DocC Archive.
                Expected a 'data' directory at the root of the archive.
                """
            )
        }
        
    }
}