Skip to content
Snippets Groups Projects
main.swift 1.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • Tobias Ullerich's avatar
    Tobias Ullerich committed
    //
    //  main.swift
    //  SwiftMetaModelGenerator
    //
    //  Created by Tobias on 23.06.21.
    //
    
    import Foundation
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
    import ArgumentParser
    import SwiftSyntax
    
    import Stencil
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
    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
        
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
        mutating func run() throws {
            let inputPath = Path(input)
    
            let classes: [ClassDeclaration]
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
            if inputPath.isDirectory {
    
                classes = try inputPath.iterateChildren().flatMap( { try processFile(file: $0) })
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
            } else {
    
                classes = try processFile(file: inputPath)
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
            }
    
            
            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)
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
        }
        
    
        func processFile(file: Path) throws -> [ClassDeclaration] {
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
            if !(file.extension?.lowercased().hasSuffix("swift") ?? false) {
    
                return []
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
            }
            
    
            let content: String = try file.read()
            
            let collector = DeclarationCollector()
            let tree = try SyntaxParser.parse(source: content)
            collector.walk(tree)
            
            return collector.classes
    
    Tobias Ullerich's avatar
    Tobias Ullerich committed
        }
    }
    
    SwiftMetaModelGenerator.main()