diff --git a/Sources/Cli/main.swift b/Sources/Cli/main.swift index eebaf6b..8ef0210 100644 --- a/Sources/Cli/main.swift +++ b/Sources/Cli/main.swift @@ -17,13 +17,63 @@ import ArgumentParser import Common +import P4Compiler +import SystemPackage @main struct Cli: ParsableCommand { - public func run() throws { - let formatter = FormatterPlain() - let e = ErrorWithLocation(sourceLocation: SourceLocation(1, 5), withError: "Testing") - let e1 = ErrorWithLocation(sourceLocation: SourceLocation(10, 5), withError: "Oh no") - print(e.append(error: e1).format(formatter)) + @Flag(help: "Disable ANSI-stylized output.") var plain: Int + + static let configuration = CommandConfiguration( + abstract: "P4CE compiler, interpreter and debugger.", + subcommands: [Compile.self]) +} + +struct CliOptions: ParsableArguments { + @ArgumentParser.Argument(help: "File to compile.") // Have to be explicit because Common has an Argument, too! + var path: String + + @Option(name: [.customShort("I")], help: "Search paths.") + var search: [String] = [] +} + +extension Cli { + struct Compile: ParsableCommand { + static let configuration = CommandConfiguration(abstract: "Compile P4CE code.") + + @ParentCommand var parent: Cli + + @OptionGroup var options: CliOptions + + mutating func run() { + let sm = SourceManager(options.search.map { FilePath($0) }) + let prep = SourceCodePreprocessor(sm) + let file = FilePath(options.path) + + let maybe_source = prep.preprocess(file) + guard case .Ok(let source) = maybe_source else { + let formatter = FormatterAnsi() + print(ErrorWithLabel("Preprocessor Error", maybe_source.error()!).format(formatter)) + return + } + + let maybe_program = Program.Compile(source.getSource()) + guard case .Ok(_) = maybe_program else { + let formatter = FormatterAnsi() + print(ErrorWithLabel("Compiler Error", maybe_source.error()!).format(formatter)) + return + } + + let success_formatter: any Formattable = + if parent.plain != 0 { + FormatterPlain() + } else { + FormatterAnsi() + } + + print( + success_formatter.formatWithStyle( + "Success", Style(StyleColor.Green, [StyleFormat.Underline]))) + } } } diff --git a/Sources/Common/Error.swift b/Sources/Common/Error.swift index 5e34a02..ab17712 100644 --- a/Sources/Common/Error.swift +++ b/Sources/Common/Error.swift @@ -107,7 +107,7 @@ public struct ErrorWithLabel: Errorable { public func format(_ formatter: any Formattable) -> String { let green = Style(StyleColor.Green) let formatted_label = formatter.formatWithStyle(self.label, green) - return formatted_label + self.error.format(formatter) + return formatted_label + ": " + self.error.format(formatter) } public init(_ label: String, _ error: any Errorable) {