Skip to content

Commit

Permalink
Add lang attribute to provide future flexibility for additional langu…
Browse files Browse the repository at this point in the history
…ages in

Plank
  • Loading branch information
rahul-malik committed Apr 27, 2017
1 parent e8d3145 commit 8119873
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 20 deletions.
73 changes: 54 additions & 19 deletions Sources/Core/FileGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,16 @@ public enum GenerationParameterType {
case includeRuntime
}

protocol FileGeneratorManager {
public enum Languages: String {
case objectiveC = "objc"
}

public protocol FileGeneratorManager {
static func filesToGenerate(descriptor: SchemaObjectRoot, generatorParameters: GenerationParameters) -> [FileGenerator]
static func runtimeFiles() -> [FileGenerator]
}

protocol FileGenerator {
public protocol FileGenerator {
func renderFile() -> String
var fileName: String { mutating get }
}
Expand Down Expand Up @@ -54,23 +59,48 @@ extension FileGenerator {

return header.joined(separator: "\n")
}

}

func generateFile(_ schema: SchemaObjectRoot, outputDirectory: URL, generationParameters: GenerationParameters) {
for var file in ObjectiveCFileGenerator.filesToGenerate(descriptor: schema, generatorParameters: generationParameters) {
let fileContents = file.renderFile() + "\n" // Ensure there is exactly one new line a the end of the file
do {
try fileContents.write(
to: URL(string: file.fileName, relativeTo: outputDirectory)!,
atomically: true,
encoding: String.Encoding.utf8)
} catch {
assert(false)
extension FileGeneratorManager {
func generateFile(_ schema: SchemaObjectRoot, outputDirectory: URL, generationParameters: GenerationParameters) {
for var file in Self.filesToGenerate(descriptor: schema, generatorParameters: generationParameters) {
let fileContents = file.renderFile() + "\n" // Ensure there is exactly one new line a the end of the file
do {
try fileContents.write(
to: URL(string: file.fileName, relativeTo: outputDirectory)!,
atomically: true,
encoding: String.Encoding.utf8)
} catch {
assert(false)
}
}
}

public func generateFileRuntime(outputDirectory: URL) {
let files: [FileGenerator] = Self.runtimeFiles()
for var file in files {
let fileContents = file.renderFile() + "\n" // Ensure there is exactly one new line a the end of the file
do {
try fileContents.write(
to: URL(string: file.fileName, relativeTo: outputDirectory)!,
atomically: true,
encoding: String.Encoding.utf8)
} catch {
assert(false)
}
}
}
}



func generator(forLanguage language: Languages) -> FileGeneratorManager {
switch language {
case .objectiveC:
return ObjectiveCFileGenerator()
}
}

public func generateFileRuntime(outputDirectory: URL) {
let files: [FileGenerator] = [ObjCRuntimeHeaderFile(), ObjCRuntimeImplementationFile()]
for var file in files {
Expand Down Expand Up @@ -100,7 +130,8 @@ public func generateDeps(urls: Set<URL>) {
}
}

public func generateFiles(urls: Set<URL>, outputDirectory: URL, generationParameters: GenerationParameters) {
public func generateFiles(urls: Set<URL>, outputDirectory: URL, generationParameters: GenerationParameters, forLanguages languages: [Languages]) {
let fileGenerators: [FileGeneratorManager] = languages.map(generator)
_ = loadSchemasForUrls(urls: urls)
var processedSchemas = Set<URL>([])
repeat {
Expand All @@ -111,17 +142,21 @@ public func generateFiles(urls: Set<URL>, outputDirectory: URL, generationParame
processedSchemas.insert(url)
switch schema {
case .object(let rootObject):
generateFile(rootObject,
outputDirectory: outputDirectory,
generationParameters: generationParameters)
fileGenerators.forEach { generator in
generator.generateFile(rootObject,
outputDirectory: outputDirectory,
generationParameters: generationParameters)
}
default:
assert(false, "Incorrect Schema for root") // TODO Better error message.
assert(false, "Incorrect Schema for root.") // TODO Better error message.
}
})
} while (
generationParameters[.recursive] != nil &&
processedSchemas.count != FileSchemaLoader.sharedInstance.refs.keys.count)
if generationParameters[.includeRuntime] != nil {
generateFileRuntime(outputDirectory: outputDirectory)
fileGenerators.forEach {
$0.generateFileRuntime(outputDirectory: outputDirectory)
}
}
}
4 changes: 4 additions & 0 deletions Sources/Core/ObjectiveCFileGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ struct ObjectiveCFileGenerator: FileGeneratorManager {
ObjCImplementationFile(roots: rootsRenderer.renderRoots(), className: rootsRenderer.className)
]
}

static func runtimeFiles() -> [FileGenerator] {
return [ObjCRuntimeHeaderFile(), ObjCRuntimeImplementationFile()]
}
}

struct ObjCHeaderFile: FileGenerator {
Expand Down
15 changes: 14 additions & 1 deletion Sources/plank/Cli.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ enum FlagOptions: String {
case printDeps = "print_deps"
case noRecursive = "no_recursive"
case onlyRuntime = "only_runtime"
case lang = "lang"
case help = "help"

func needsArgument() -> Bool {
Expand All @@ -28,6 +29,7 @@ enum FlagOptions: String {
case .printDeps: return false
case .noRecursive: return false
case .onlyRuntime: return false
case .lang: return true
case .help: return false
}
}
Expand All @@ -41,6 +43,7 @@ extension FlagOptions : HelpCommandOutput {
" --\(FlagOptions.printDeps.rawValue) - Just print the path to the dependent schemas necessary to generate the schemas provided and exit.",
" --\(FlagOptions.noRecursive.rawValue) - Don't generate files recursively. Only generate the one file I ask for.",
" --\(FlagOptions.onlyRuntime.rawValue) - Only generate runtime files and exit.",
" --\(FlagOptions.lang.rawValue) - Comma separated list of target language(s) for generating code. Default: \"objc\"",
" --\(FlagOptions.help.rawValue) - Show this text and exit."
].joined(separator: "\n")
}
Expand Down Expand Up @@ -165,9 +168,19 @@ func handleGenerateCommand(withArguments arguments: [String]) {
} else if flags[.onlyRuntime] != nil {
generateFileRuntime(outputDirectory: outputDirectory)
} else {
let languages: [Languages] = flags[.lang]?.trimmingCharacters(in: .whitespaces).components(separatedBy: ",").flatMap {
guard let lang = Languages.init(rawValue: $0) else {
fatalError("Invalid or unsupported language: \($0)")
}
return lang
} ?? [.objectiveC]
guard languages.count > 0 else {
fatalError("Unsupported value for lang: \"\(String(describing:flags[.lang]))\"")
}
generateFiles(urls: Set(urls),
outputDirectory: outputDirectory,
generationParameters: generationParameters)
generationParameters: generationParameters,
forLanguages: languages)
}
}

Expand Down

0 comments on commit 8119873

Please sign in to comment.