Newer
Older
//
// main.swift
// SwiftMetaModelGenerator
//
// Created by Tobias on 23.06.21.
//
import Foundation
import PathKit
struct SwiftMetaModelGenerator: ParsableCommand
{
@Option(name: .shortAndLong, help: "Input file or folder")
var input: String
@Option(name: .shortAndLong, help: "Output file")
var output: String
mutating func run() throws {
let inputPath = Path(input)
classes = try inputPath.iterateChildren().flatMap( { try processFile(file: $0) })
classes = try processFile(file: inputPath)
let context = [
"classes": classes
]
let environment = Environment(loader: FileSystemLoader(paths: ["/Users/tobias/Documents/Programmieren/Projects/SwiftMetaModelGenerator/SwiftMetaModelGenerator/templates/"]))
let rendered = try environment.renderTemplate(name: "meta_model.stencil", context: context)
try Path(output).write(rendered)
func processFile(file: Path) throws -> [ClassDeclaration] {
if !(file.extension?.lowercased().hasSuffix("swift") ?? false) {
let content: String = try file.read()
let collector = DeclarationCollector()
let tree = try SyntaxParser.parse(source: content)
collector.walk(tree)
return collector.classes