Skip to content

Commit 23a8e3a

Browse files
committed
Fixes API availability annotation
1 parent 8e8bce2 commit 23a8e3a

File tree

2 files changed

+44
-24
lines changed

2 files changed

+44
-24
lines changed

Sources/TecoServiceGenerator/builders/Action.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ import SwiftSyntax
22
import SwiftSyntaxBuilder
33
import TecoCodeGeneratorCommons
44

5-
typealias Deprecation = (deprecated: Bool, message: String?)
6-
7-
private func buildActionAttributeList(discardableResult: Bool, deprecation: Deprecation) -> AttributeListSyntax {
5+
private func buildActionAttributeList(for action: APIModel.Action, discardableResult: Bool) -> AttributeListSyntax {
86
AttributeListSyntax {
9-
if deprecation.deprecated {
10-
if let message = deprecation.message {
11-
AttributeSyntax("@available(*, deprecated, message: \(literal: message))")
7+
if let availability = action.availability {
8+
if let message = action.deprecationMessage {
9+
AttributeSyntax("@available(*, \(raw: availability), message: \(literal: message))")
1210
.withTrailingTrivia(.newline)
1311
} else {
14-
AttributeSyntax("@available(*, deprecated)").withTrailingTrivia(.newline)
12+
AttributeSyntax("@available(*, \(raw: availability))").withTrailingTrivia(.newline)
1513
}
1614
}
1715
AttributeSyntax("@inlinable")
@@ -24,7 +22,7 @@ private func buildActionAttributeList(discardableResult: Bool, deprecation: Depr
2422
func buildActionDecl(for action: String, metadata: APIModel.Action, discardableResult: Bool) -> FunctionDeclSyntax {
2523
FunctionDeclSyntax("""
2624
\(raw: buildDocumentation(summary: metadata.name, discussion: metadata.document))
27-
\(buildActionAttributeList(discardableResult: discardableResult, deprecation: metadata.deprecation))
25+
\(buildActionAttributeList(for: metadata, discardableResult: discardableResult))
2826
public func \(raw: action.lowerFirst())(_ input: \(raw: metadata.input), region: TCRegion? = nil, logger: Logger = TCClient.loggingDisabled, on eventLoop: EventLoop? = nil) -> \(raw: "EventLoopFuture<\(metadata.output)>") {
2927
self.client.execute(action: \(literal: action), region: region, serviceConfig: self.config\(raw: skipAuthorizationParameter(for: action)), input: input, logger: logger, on: eventLoop)
3028
}
@@ -34,7 +32,7 @@ func buildActionDecl(for action: String, metadata: APIModel.Action, discardableR
3432
func buildAsyncActionDecl(for action: String, metadata: APIModel.Action, discardableResult: Bool) -> FunctionDeclSyntax {
3533
FunctionDeclSyntax("""
3634
\(raw: buildDocumentation(summary: metadata.name, discussion: metadata.document))
37-
\(buildActionAttributeList(discardableResult: discardableResult, deprecation: metadata.deprecation))
35+
\(buildActionAttributeList(for: metadata, discardableResult: discardableResult))
3836
public func \(raw: action.lowerFirst())(_ input: \(raw: metadata.input), region: TCRegion? = nil, logger: Logger = TCClient.loggingDisabled, on eventLoop: EventLoop? = nil) async throws -> \(raw: metadata.output) {
3937
try await self.client.execute(action: \(literal: action), region: region, serviceConfig: self.config\(raw: skipAuthorizationParameter(for: action)), input: input, logger: logger, on: eventLoop).get()
4038
}
@@ -44,7 +42,7 @@ func buildAsyncActionDecl(for action: String, metadata: APIModel.Action, discard
4442
func buildUnpackedActionDecl(for action: String, metadata: APIModel.Action, inputMembers: [APIObject.Member], discardableResult: Bool) -> FunctionDeclSyntax {
4543
FunctionDeclSyntax("""
4644
\(raw: buildDocumentation(summary: metadata.name, discussion: metadata.document))
47-
\(buildActionAttributeList(discardableResult: discardableResult, deprecation: metadata.deprecation))
45+
\(buildActionAttributeList(for: metadata, discardableResult: discardableResult))
4846
public func \(raw: action.lowerFirst())(\(raw: initializerParameterList(for: inputMembers, packed: true))region: TCRegion? = nil, logger: Logger = TCClient.loggingDisabled, on eventLoop: EventLoop? = nil) -> \(raw: "EventLoopFuture<\(metadata.output)>") {
4947
self.\(raw: action.lowerFirst())(\(raw: metadata.input)(\(raw: inputMembers.map({ "\($0.identifier): \($0.escapedIdentifier)" }).joined(separator: ", "))), region: region, logger: logger, on: eventLoop)
5048
}
@@ -54,13 +52,9 @@ func buildUnpackedActionDecl(for action: String, metadata: APIModel.Action, inpu
5452
func buildUnpackedAsyncActionDecl(for action: String, metadata: APIModel.Action, inputMembers: [APIObject.Member], discardableResult: Bool) -> FunctionDeclSyntax {
5553
FunctionDeclSyntax("""
5654
\(raw: buildDocumentation(summary: metadata.name, discussion: metadata.document))
57-
\(buildActionAttributeList(discardableResult: discardableResult, deprecation: metadata.deprecation))
55+
\(buildActionAttributeList(for: metadata, discardableResult: discardableResult))
5856
public func \(raw: action.lowerFirst())(\(raw: initializerParameterList(for: inputMembers, packed: true))region: TCRegion? = nil, logger: Logger = TCClient.loggingDisabled, on eventLoop: EventLoop? = nil) async throws -> \(raw: metadata.output) {
5957
try await self.\(raw: action.lowerFirst())(\(raw: metadata.input)(\(raw: inputMembers.map({ "\($0.identifier): \($0.escapedIdentifier)" }).joined(separator: ", "))), region: region, logger: logger, on: eventLoop)
6058
}
6159
""")
6260
}
63-
64-
extension APIModel.Action {
65-
fileprivate var deprecation: Deprecation { (self.deprecated, self.deprecationMessage) }
66-
}

Sources/TecoServiceGenerator/models/APIModel.swift

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,54 @@ struct APIModel: Codable {
88

99
struct Action: Codable {
1010
let name: String
11-
let document: String
11+
private let _document: String
1212
let input: String
1313
let output: String
14-
let status: String?
14+
private let _status: Status?
1515

16-
var deprecated: Bool {
16+
var status: Status { self._status ?? .online }
17+
var availability: String? {
1718
switch self.status {
18-
case .none, "online": return false
19-
case "deprecated": return true
20-
default: fatalError("Unexpected action status: \(status!)")
19+
case .online:
20+
return nil
21+
case .deprecated:
22+
return "deprecated"
23+
case .offline:
24+
return "unavailable"
25+
}
26+
}
27+
28+
var document: String {
29+
if let deprecationMessage {
30+
return self._document.dropFirst(deprecationMessage.count).trimmingCharacters(in: .whitespacesAndNewlines)
31+
} else {
32+
return self._document.trimmingCharacters(in: .whitespacesAndNewlines)
2133
}
2234
}
2335

2436
var deprecationMessage: String? {
25-
guard self.deprecated else { return nil }
37+
guard self.status != .online else { return nil }
2638
if #available(macOS 13, *) {
27-
return self.document.split(separator: "/n/n").first.map(String.init)
39+
return self._document.split(separator: "\n\n").first.map(String.init)
2840
} else {
2941
// message may be stripped since this platform doesn't support Regex...
30-
return self.document.split(whereSeparator: \.isNewline).first.map(String.init)
42+
return self._document.split(whereSeparator: \.isNewline).first.map(String.init)
3143
}
3244
}
45+
46+
enum CodingKeys: String, CodingKey {
47+
case name
48+
case _document = "document"
49+
case input
50+
case output
51+
case _status = "status"
52+
}
53+
54+
enum Status: String, Codable {
55+
case online
56+
case deprecated
57+
case offline
58+
}
3359
}
3460

3561
struct Metadata: Codable {

0 commit comments

Comments
 (0)