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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2014-2022 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import ArgumentParser
import Basics
import CoreCommands
import PackageGraph
import PackageModel
extension SwiftPackageCommand {
struct Learn: SwiftCommand {
@OptionGroup()
var globalOptions: GlobalOptions
static let configuration = CommandConfiguration(abstract: "Learn about Swift and this package")
func files(fileSystem: FileSystem, in directory: AbsolutePath, fileExtension: String? = nil) throws -> [AbsolutePath] {
guard fileSystem.isDirectory(directory) else {
return []
}
let files = try fileSystem.getDirectoryContents(directory)
.map { try AbsolutePath(validating: $0, relativeTo: directory) }
.filter { fileSystem.isFile($0) }
guard let fileExtension else {
return files
}
return files.filter { $0.extension == fileExtension }
}
func subdirectories(fileSystem: FileSystem, in directory: AbsolutePath) throws -> [AbsolutePath] {
guard fileSystem.isDirectory(directory) else {
return []
}
return try fileSystem.getDirectoryContents(directory)
.map { try AbsolutePath(validating: $0, relativeTo: directory) }
.filter { fileSystem.isDirectory($0) }
}
func loadSnippetsAndSnippetGroups(fileSystem: FileSystem, from package: ResolvedPackage) throws -> [SnippetGroup] {
let snippetsDirectory = package.path.appending("Snippets")
guard fileSystem.isDirectory(snippetsDirectory) else {
return []
}
let topLevelSnippets = try files(fileSystem: fileSystem, in: snippetsDirectory, fileExtension: "swift")
.map { try Snippet(parsing: $0) }
let topLevelSnippetGroup = SnippetGroup(name: "Getting Started",
baseDirectory: snippetsDirectory,
snippets: topLevelSnippets,
explanation: "")
let subdirectoryGroups = try subdirectories(fileSystem: fileSystem, in: snippetsDirectory)
.map { subdirectory -> SnippetGroup in
let snippets = try files(fileSystem: fileSystem, in: subdirectory, fileExtension: "swift")
.map { try Snippet(parsing: $0) }
let explanationFile = subdirectory.appending("Explanation.md")
let snippetGroupExplanation: String
if fileSystem.isFile(explanationFile) {
snippetGroupExplanation = try String(contentsOf: explanationFile.asURL)
} else {
snippetGroupExplanation = ""
}
return SnippetGroup(name: subdirectory.basename,
baseDirectory: subdirectory,
snippets: snippets,
explanation: snippetGroupExplanation)
}
let snippetGroups = [topLevelSnippetGroup] + subdirectoryGroups.sorted {
$0.baseDirectory.basename < $1.baseDirectory.basename
}
return snippetGroups.filter { !$0.snippets.isEmpty }
}
func run(_ swiftCommandState: SwiftCommandState) throws {
let graph = try swiftCommandState.loadPackageGraph()
let package = graph.rootPackages[graph.rootPackages.startIndex]
print(package.products.map { $0.description })
let snippetGroups = try loadSnippetsAndSnippetGroups(fileSystem: swiftCommandState.fileSystem, from: package)
var cardStack = CardStack(package: package, snippetGroups: snippetGroups, swiftCommandState: swiftCommandState)
cardStack.run()
}
}
}
|