Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add possiblity to check http status code #65

Merged
merged 4 commits into from
Oct 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .surfgen.generator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ templates:
# This template will generate Implementation for service

- type: service
nameSuffix: Service
nameSuffix: NetworkService
fileExtension: swift
templatePath: ./Templates/v2/Swift/NetworkService.stencil
destinationPath: ./tmp/Sources/Services/{name}
Expand Down
Binary file modified Binary
Binary file not shown.
9 changes: 9 additions & 0 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@
"version": "1.0.1"
}
},
{
"package": "Rainbow",
"repositoryURL": "https://github.com/onevcat/Rainbow",
"state": {
"branch": null,
"revision": "626c3d4b6b55354b4af3aa309f998fae9b31a3d9",
"version": "3.2.0"
}
},
{
"package": "ShellOut",
"repositoryURL": "https://github.com/JohnSundell/ShellOut.git",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public struct DataGenerationModel: Encodable {
public let isTypeObject: Bool

init(dataModel: DataModel) {
encoding = dataModel.mediaType
typeNames = dataModel.type.nameOptions
isTypeArray = dataModel.type.isArray
isTypeObject = dataModel.type.isObject
self.encoding = dataModel.mediaType
self.typeNames = dataModel.type.nameOptions
self.isTypeArray = dataModel.type.isArray
self.isTypeObject = dataModel.type.isObject
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
//
// OperationGenerationModel.swift
//
//
// Created by Александр Кравченков on 19.10.2021.
//

import Foundation

/// Model for code generator
/// Based on `OperationModel`
///
/// /// ## Serialization schema
///
/// ```YAML
///
/// OperationModel:
/// type: object
/// properties:
/// httpMethod:
/// type: string
/// description:
/// type: string
/// nullable: true
/// pathParameters:
/// nullable: true
/// type: array
/// items:
/// $ref: "#components/schemas/ParameterModel"
/// queryParameters:
/// nullable: true
/// type: array
/// items:
/// $ref: "#components/schemas/ParameterModel"
/// requestGenerationModel:
/// nullable: true
/// type: array
/// items:
/// $ref: "#components/schemas/DataGenerationModel"
/// responseGenerationModel:
/// nullable: true
/// type:
/// $ref: "#components/schemas/DataGenerationModel"
/// ```
public struct OperationGenerationModel: Encodable {

public struct Keyed<T: Encodable>: Encodable {
let key: String
let value: T?
}

/// http method string representation
///
/// For example `GET`
public let httpMethod: String
/// Short summary of what the operation does
public let summary: String?
/// Verbose explanation of the operation behavior
public let description: String?
/// Path and query parameters of specific operations
public let parameters: [Reference<ParameterModel>]?
public let responses: [Reference<ResponseModel>]?
public let requestModel: Reference<RequestModel>?

public let pathParameters: [ParameterModel]
public let queryParameters: [ParameterModel]
public let requestGenerationModel: DataGenerationModel?
public let responseGenerationModel: Keyed<DataGenerationModel>?

public let allGenerationResponses: [ResponseGenerationModel]?

init(operationModel: OperationModel) {
self.httpMethod = operationModel.httpMethod
self.summary = operationModel.summary

self.description = operationModel.description
self.parameters = operationModel.parameters
self.responses = operationModel.responses
self.requestModel = operationModel.requestModel

let allParameters = (operationModel.parameters ?? [])
.map { $0.value }
.sorted { $0.name < $1.name }
self.pathParameters = allParameters.filter { $0.location == .path }
self.queryParameters = allParameters.filter { $0.location == .query }

let request = operationModel.requestModel?.value.content.first
self.requestGenerationModel = request.map { DataGenerationModel(dataModel: $0) }

let response = operationModel.responses?.first { $0.value.key.isSuccessStatusCode }?.value

if let response = response {
self.responseGenerationModel = .init(
key: response.key,
value: response.values.first.map { DataGenerationModel(dataModel: $0) }
)
} else {
self.responseGenerationModel = nil
}

self.allGenerationResponses = self.responses?
.map { $0.value }
.map { response in
ResponseGenerationModel(
key: response.key,
responses: response.values.map { DataGenerationModel(dataModel: $0) }
)
}
}
}

extension OperationGenerationModel {

var codingKeys: [String] {
return queryParameters.map { $0.name }
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// PathGenerationModel.swift
//
//
// Created by Александр Кравченков on 19.10.2021.
//

import Foundation

/// Model for code generator
/// Based on `PathModel`
public struct PathGenerationModel: Encodable {

public let path: String
public let operations: [OperationGenerationModel]

public var name: String
public let pathWithSeparatedParameters: String
public let parameters: [ParameterModel]

public init(pathModel: PathModel) {
self.path = pathModel.path
self.operations = pathModel.operations
.sorted { $0.httpMethod < $1.httpMethod }
.map { OperationGenerationModel(operationModel: $0) }
self.name = pathModel.path.pathName
self.pathWithSeparatedParameters = pathModel.path.pathWithSeparatedParameters
self.parameters = operations[0].pathParameters
}

}

extension PathGenerationModel {

var codingKeys: [String] {
return operations.flatMap { $0.codingKeys }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//
// ResponseGenerationModel.swift
//
//
// Created by Александр Кравченков on 19.10.2021.
//

import Foundation

/// Container for different `DataGenerationModel` with the same `http status code` or other response key
public struct ResponseGenerationModel: Encodable {
public let key: String
public let responses: [DataGenerationModel]

public init(key: String, responses: [DataGenerationModel]) {
self.key = key
self.responses = responses
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import Foundation
public struct ServiceGenerationModel {

public let name: String
public let paths: [PathModel]
public let paths: [PathGenerationModel]
public let codingKeys: [String]

public init(name: String, paths: [PathModel]) {
public init(name: String, paths: [PathGenerationModel]) {
self.name = name
self.paths = paths.sorted { $0.name < $1.name }
self.codingKeys = paths
Expand Down
50 changes: 0 additions & 50 deletions Sources/CodeGenerator/Models/PathModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,64 +38,14 @@ import Foundation
/// schema:
/// $ref: "models.yaml#/components/schemas/UserContactInfo"
/// ```
///
/// ## Serialization schema
///
/// ```YAML
///
/// Type:
/// type: string
/// enum: ['object', 'group']
///
/// SchemaGroupType:
/// type: string
/// enum: ['oneOf', 'onyOf', 'allOf']
///
/// PossibleType:
/// type: object
/// properties:
/// type:
/// type:
/// $ref: "#/components/schemas/Type"
/// value:
/// type:
/// schema:
/// oneOf:
/// - $ref: "schema_object_model.yaml#/component/schemas/SchemaObjectModel"
/// - $ref: "schema_group_model.yaml#/component/schemas/SchemaGroupModel"
///
/// PathModel:
/// type: object
/// prperties:
/// path:
/// type: string
/// operations:
/// type: array
/// items:
/// $ref: "operation_model.yaml#/components/schemas/OperationModel"
/// ```
public struct PathModel: Encodable {
/// URI template
public let path: String
public let operations: [OperationModel]
// TODO - create new model for code gen
public var name: String
let pathWithSeparatedParameters: String
let parameters: [ParameterModel]

public init(path: String, operations: [OperationModel]) {
self.path = path
self.operations = operations.sorted { $0.httpMethod < $1.httpMethod }
self.name = path.pathName
self.pathWithSeparatedParameters = path.pathWithSeparatedParameters
self.parameters = operations[0].pathParameters
}

}

extension PathModel {

var codingKeys: [String] {
return operations.flatMap { $0.codingKeys }
}
}
80 changes: 0 additions & 80 deletions Sources/CodeGenerator/Models/ServiceMethod/OperationModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,61 +42,6 @@ import GASTTree
/// schema:
/// $ref: "models.yaml#/components/schemas/PaymentDetailsResponse"
/// ```
///
/// ## Serialization schema
///
/// ```YAML
///
/// ParametersRef:
/// type: object
/// properties:
/// isReference:
/// type: bool
/// value:
/// type:
/// $ref: "parameter_model.yaml#/components/schemas/ParameterModel"
///
/// ResponseModelRef:
/// type: object
/// properties:
/// isReference:
/// type: bool
/// value:
/// type:
/// $ref: "response_model.yaml#/components/schemas/ResponseModel"
///
/// RequestModelRef:
/// type: object
/// properties:
/// isReference:
/// type: bool
/// value:
/// type:
/// $ref: "request_model.yaml#/components/schemas/RequestModel"
///
/// OperationModel:
/// type: object
/// properties:
/// httpMethod:
/// type: string
/// description:
/// type: string
/// nullable: true
/// parameters:
/// nullable: true
/// type: array
/// items:
/// $ref: "#components/schemas/ParametersRef"
/// responses:
/// nullable: true
/// type: array
/// items:
/// $ref: "#components/schemas/ResponseModelRef"
/// responses:
/// nullable: true
/// type:
/// $ref: "#components/schemas/ResponseModelRef"
/// ```
public struct OperationModel: Encodable {

/// http method string representation
Expand All @@ -112,11 +57,6 @@ public struct OperationModel: Encodable {
public let responses: [Reference<ResponseModel>]?
public let requestModel: Reference<RequestModel>?

let pathParameters: [ParameterModel]
let queryParameters: [ParameterModel]
let requestGenerationModel: DataGenerationModel?
let responseGenerationModel: DataGenerationModel?

init(httpMethod: String,
summary: String?,
description: String?,
Expand All @@ -130,25 +70,5 @@ public struct OperationModel: Encodable {
self.parameters = parameters
self.responses = responses
self.requestModel = requestModel

let allParameters = (parameters ?? [])
.map { $0.value }
.sorted { $0.name < $1.name }
self.pathParameters = allParameters.filter { $0.location == .path }
self.queryParameters = allParameters.filter { $0.location == .query }

let request = requestModel?.value.content.first
self.requestGenerationModel = request.map { DataGenerationModel(dataModel: $0) }

let response = responses?.first { $0.value.key.isSuccessStatusCode }?.value.values.first
self.responseGenerationModel = response.map { DataGenerationModel(dataModel: $0) }
}
}

extension OperationModel {

var codingKeys: [String] {
return queryParameters.map { $0.name }
}

}
Loading