96 lines
2.5 KiB
Swift
96 lines
2.5 KiB
Swift
import ArgumentParser
|
|
import CommandClient
|
|
import PandocClient
|
|
|
|
@dynamicMemberLookup
|
|
struct GenerateOptions: ParsableArguments {
|
|
|
|
@OptionGroup var basic: BasicGlobalOptions
|
|
|
|
@Option(
|
|
name: .shortAndLong,
|
|
help: "Custom build directory path.",
|
|
completion: .directory
|
|
)
|
|
var buildDirectory: String?
|
|
|
|
@Option(
|
|
name: [.short, .customLong("file")],
|
|
help: "Files used to generate the output, can be specified multiple times.",
|
|
completion: .file()
|
|
)
|
|
var files: [String] = []
|
|
|
|
@Option(
|
|
name: [.customShort("H"), .long],
|
|
help: "Files to include in the header, can be specified multiple times.",
|
|
completion: .file()
|
|
)
|
|
var includeInHeader: [String] = []
|
|
|
|
@Flag(
|
|
help: "Do not build the project prior to generating the output."
|
|
)
|
|
var noBuild: Bool = false
|
|
|
|
@Option(
|
|
name: .shortAndLong,
|
|
help: "The project directory.",
|
|
completion: .directory
|
|
)
|
|
var projectDirectory: String?
|
|
|
|
@Option(
|
|
name: .shortAndLong,
|
|
help: "The output directory",
|
|
completion: .directory
|
|
)
|
|
var outputDirectory: String?
|
|
|
|
@Option(
|
|
name: [.customShort("n"), .customLong("name")],
|
|
help: "Name of the output file."
|
|
)
|
|
var outputFileName: String?
|
|
|
|
// NOTE: This must be last, both here and in the commands, so if the commands have options of their
|
|
// own, they must be declared ahead of using the global options.
|
|
|
|
@Argument(
|
|
help: "Extra arguments / options to pass to the underlying pandoc command."
|
|
)
|
|
var extraOptions: [String] = []
|
|
|
|
subscript<T>(dynamicMember keyPath: WritableKeyPath<BasicGlobalOptions, T>) -> T {
|
|
get { basic[keyPath: keyPath] }
|
|
set { basic[keyPath: keyPath] = newValue }
|
|
}
|
|
|
|
subscript<T>(dynamicMember keyPath: KeyPath<BasicGlobalOptions, T>) -> T {
|
|
basic[keyPath: keyPath]
|
|
}
|
|
}
|
|
|
|
extension GenerateOptions {
|
|
|
|
func loggingOptions(commandName: String) -> LoggingOptions {
|
|
basic.loggingOptions(commandName: commandName)
|
|
}
|
|
|
|
func pandocRunOptions(commandName: String) -> PandocClient.RunOptions {
|
|
.init(
|
|
buildDirectory: buildDirectory,
|
|
extraOptions: extraOptions.count > 0 ? extraOptions : nil,
|
|
files: files.count > 0 ? files : nil,
|
|
loggingOptions: .init(commandName: commandName, logLevel: .init(globals: basic, quietOnlyPlaybook: false)),
|
|
includeInHeader: includeInHeader.count > 0 ? includeInHeader : nil,
|
|
outputDirectory: outputDirectory,
|
|
projectDirectory: projectDirectory,
|
|
outputFileName: outputFileName,
|
|
quiet: basic.quiet,
|
|
shell: basic.shell,
|
|
shouldBuild: !noBuild
|
|
)
|
|
}
|
|
}
|