Skip to content

Commit

Permalink
Support configurable URI types for Java (#245)
Browse files Browse the repository at this point in the history
The following types are supported:

- String (default)
- java.net.URI
- android.net.Uri
- okhttp3.HttpUrl
  • Loading branch information
jparise authored Sep 3, 2019
1 parent 618acaa commit eeb4918
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 4 deletions.
1 change: 1 addition & 0 deletions Sources/Core/FileGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public enum GenerationParameterType {
case javaGeneratePackagePrivateSetters
case javaDecorations
case javaUnknownPropertyLogging
case javaURIType
}

// Most of these are derived from https://www.binpress.com/tutorial/objective-c-reserved-keywords/43
Expand Down
9 changes: 6 additions & 3 deletions Sources/Core/JavaFileRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

import Foundation

protocol JavaFileRenderer: FileRenderer {}
protocol JavaFileRenderer: FileRenderer {
func renderURIType() -> String
}

extension JavaFileRenderer {
func interfaceName() -> String {
Expand Down Expand Up @@ -67,9 +69,10 @@ extension JavaFileRenderer {
.string(format: .some(.email)),
.string(format: .some(.hostname)),
.string(format: .some(.ipv4)),
.string(format: .some(.ipv6)),
.string(format: .some(.uri)):
.string(format: .some(.ipv6)):
return "String"
case .string(format: .some(.uri)):
return renderURIType()
case .string(format: .some(.dateTime)):
return "Date"
case .integer:
Expand Down
27 changes: 27 additions & 0 deletions Sources/Core/JavaIR.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,33 @@ enum JavaLoggingType {
}
}

enum JavaURIType: String, CaseIterable {
case androidNetUri = "android.net.Uri"
case javaNetURI = "java.net.URI"
case okHttp3HttpUrl = "okhttp3.HttpUrl"
case string = "String"

static var options: String {
return allCases.map({ "\"\($0.rawValue)\"" }).joined(separator: ", ")
}

var type: String {
switch self {
case .androidNetUri: return "Uri"
case .javaNetURI: return "URI"
case .okHttp3HttpUrl: return "HttpUrl"
case .string: return "String"
}
}

var imports: [String] {
switch self {
case .string: return []
default: return [self.rawValue]
}
}
}

//
// The json file passed in via java_decorations_beta=model_decorations.json is deserialized into this.
//
Expand Down
15 changes: 14 additions & 1 deletion Sources/Core/JavaModelRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public struct JavaModelRenderer: JavaFileRenderer {
let params: GenerationParameters
let decorations: JavaDecorations
let unknownPropertyLogging: JavaLoggingType?
let uriType: JavaURIType

init(rootSchema: SchemaObjectRoot, params: GenerationParameters) {
self.rootSchema = rootSchema
Expand All @@ -32,6 +33,18 @@ public struct JavaModelRenderer: JavaFileRenderer {
} else {
unknownPropertyLogging = nil
}

if let uriType = JavaURIType(rawValue: params[.javaURIType] ?? JavaURIType.string.rawValue) {
self.uriType = uriType
} else {
fatalError("java_uri_type must be one of " + JavaURIType.options + ". Invalid type provided: " + params[.javaURIType]!)
}
}

// MARK: - JavaFileRenderer

func renderURIType() -> String {
return uriType.type
}

// MARK: - Top-level Model
Expand Down Expand Up @@ -405,7 +418,7 @@ public struct JavaModelRenderer: JavaFileRenderer {
}
}

let additionalImports = propertyTypeImports + (unknownPropertyLogging?.imports ?? []) + (decorations.imports ?? [])
let additionalImports = propertyTypeImports + uriType.imports + (unknownPropertyLogging?.imports ?? []) + (decorations.imports ?? [])

let imports = [
JavaIR.Root.imports(names: Set([
Expand Down
5 changes: 5 additions & 0 deletions Sources/plank/Cli.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ enum FlagOptions: String {
case javaGeneratePackagePrivateSetters = "java_generate_package_private_setters_beta"
case javaDecorations = "java_decorations_beta"
case javaUnknownPropertyLogging = "java_unknown_property_logging"
case javaURIType = "java_uri_type"
case printDeps = "print_deps"
case noRecursive = "no_recursive"
case noRuntime = "no_runtime"
Expand All @@ -47,6 +48,7 @@ enum FlagOptions: String {
case .javaGeneratePackagePrivateSetters: return false
case .javaDecorations: return true
case .javaUnknownPropertyLogging: return true
case .javaURIType: return true
}
}
}
Expand All @@ -73,6 +75,7 @@ extension FlagOptions: HelpCommandOutput {
" --\(FlagOptions.javaGeneratePackagePrivateSetters.rawValue) - Generate package-private setter methods (beta)",
" --\(FlagOptions.javaDecorations.rawValue) - Custom decorations to apply to the generated Java model (beta).",
" --\(FlagOptions.javaUnknownPropertyLogging.rawValue) - Enable unknown property logging. Can be \"android-log-d\".",
" --\(FlagOptions.javaURIType.rawValue) - The type to use for URIs. Can be \"String\" (default), \"java.net.URI\", \"android.net.Uri\", or \"okhttp3.HttpUrl\".",
].joined(separator: "\n")
}
}
Expand Down Expand Up @@ -160,6 +163,7 @@ func handleGenerateCommand(withArguments arguments: [String]) {
let javaGeneratePackagePrivateSetters: String? = (flags[.javaGeneratePackagePrivateSetters] == nil) ? .none : .some("")
let javaDecorations: String? = flags[.javaDecorations]
let javaUnknownPropertyLogging: String? = flags[.javaUnknownPropertyLogging]
let javaURIType: String? = flags[.javaURIType]

let generationParameters: GenerationParameters = [
(.recursive, recursive),
Expand All @@ -171,6 +175,7 @@ func handleGenerateCommand(withArguments arguments: [String]) {
(.javaGeneratePackagePrivateSetters, javaGeneratePackagePrivateSetters),
(.javaDecorations, javaDecorations),
(.javaUnknownPropertyLogging, javaUnknownPropertyLogging),
(.javaURIType, javaURIType),
].reduce([:]) { (dict: GenerationParameters, tuple: (GenerationParameterType, String?)) in
var mutableDict = dict
if let val = tuple.1 {
Expand Down

0 comments on commit eeb4918

Please sign in to comment.