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
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2014-2021 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 CoreCommands
import PackageModel
/// A card showing the snippets in a ``SnippetGroup``.
struct SnippetGroupCard: Card {
/// The snippet group to display in the terminal.
var snippetGroup: SnippetGroup
/// The tool used for eventually building and running a chosen snippet.
var swiftCommandState: SwiftCommandState
var inputPrompt: String? {
return """
Choose a number or a name from the list of snippets.
To go back, press enter.
To exit, enter `q`.
"""
}
func acceptLineInput<S>(_ line: S) -> CardEvent? where S : StringProtocol {
if line.isEmpty || line.allSatisfy({ $0.isWhitespace }) {
return .pop()
}
if line.prefix(while: { !$0.isWhitespace }).lowercased() == "q" {
return .quit()
}
if let index = Int(line),
snippetGroup.snippets.indices.contains(index) {
return .push(SnippetCard(snippet: snippetGroup.snippets[index], number: index, swiftCommandState: swiftCommandState))
} else if let foundSnippetIndex = snippetGroup.snippets.firstIndex(where: { $0.name == line }) {
return .push(SnippetCard(snippet: snippetGroup.snippets[foundSnippetIndex], number: foundSnippetIndex, swiftCommandState: swiftCommandState))
} else {
print(red { "There is not a snippet by that name or index." })
return nil
}
}
func render() -> String {
precondition(!snippetGroup.snippets.isEmpty)
var rendered = brightYellow {
"""
# \(snippetGroup.name)
"""
}.terminalString()
if !snippetGroup.explanation.isEmpty {
rendered += snippetGroup.explanation
}
rendered += "\n"
rendered += snippetGroup.snippets
.enumerated()
.map { pair -> String in
let (number, snippet) = pair
return brightCyan {
"\(number). \(snippet.name)\n"
plain {
snippet.explanation.spm_multilineIndent(count: 3)
}
}.terminalString()
}
.joined(separator: "\n\n")
return rendered
}
}
|