Skip to content

Commit

Permalink
SPT-1998 fix pr
Browse files Browse the repository at this point in the history
  • Loading branch information
mrandrewsmith committed Mar 27, 2024
1 parent 6ad40c1 commit 2a6d2fc
Show file tree
Hide file tree
Showing 11 changed files with 39 additions and 33 deletions.
13 changes: 7 additions & 6 deletions NodeKit/Core/Node/NodeResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
/// Результат метода обработки данных узла.
public typealias NodeResult<Output> = Result<Output, Error>

extension NodeResult {
public extension NodeResult {

/// Метод асинхронной трансформации положительного результата
///
/// - Parameter transform: Ассинхронная функция трансформации положительного результата
/// - Returns: Результат применения трансформации.
@inlinable public func asyncFlatMap<NewSuccess>(
@inlinable func asyncFlatMap<NewSuccess>(
_ transform: (Success) async -> NodeResult<NewSuccess>
) async -> NodeResult<NewSuccess> {
switch self {
Expand All @@ -30,7 +30,7 @@ extension NodeResult {
///
/// - Parameter transform: Ассинхронная функция трансформации ошибки
/// - Returns: Результат применения трансформации.
@inlinable public func asyncFlatMapError(
@inlinable func asyncFlatMapError(
_ transform: (Failure) async -> NodeResult<Success>
) async -> NodeResult<Success> {
switch self {
Expand All @@ -45,7 +45,7 @@ extension NodeResult {
///
/// - Parameter transform: Функция трансформации ошибки, способная выкинуть Exception
/// - Returns: Результат применения трансформации или Exception.
@inlinable public func map<NewSuccess>(
@inlinable func map<NewSuccess>(
_ transform: (Success) throws -> NewSuccess
) rethrows -> NodeResult<NewSuccess> {
switch self {
Expand All @@ -58,8 +58,9 @@ extension NodeResult {

/// Метод вызывает ассинхронную функцию и оборачивает пойманные Exceptions в failure(error)
///
/// - Parameter customError: Ошибка, которая будет передаваться в failure вместо Exeception
/// - Parameter function: Ассинхронная функция, способная выкинуть Exception
/// - Parameters:
/// - customError: Ошибка, которая будет передаваться в failure вместо Exeception
/// - function: Ассинхронная функция, способная выкинуть Exception
/// - Returns: Результат с преобразованными Exceptions в failure.
static func withMappedExceptions<T>(
_ customError: Error? = nil,
Expand Down
5 changes: 2 additions & 3 deletions NodeKit/Layers/ConfigurationLayer/ChainConfiguratorNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ open class ChainConfiguratorNode<I, O>: AsyncNode {
self.init(next: next, beginQueue: .global(qos: .userInitiated), endQueue: .main)
}

/// Созздает асинхронный контект с очередью `beginQueue`,
/// оздает асинхронный контекст с очередью `beginQueue`,
/// затем выполняет всю цепочку операций и диспатчит ответ на `endQueue`
///
/// - Parameter data: Данные для обработки
Expand All @@ -47,8 +47,7 @@ open class ChainConfiguratorNode<I, O>: AsyncNode {
.dispatchOn(self.endQueue)
}

/// Созздает асинхронный контект с очередью `beginQueue`,
/// затем выполняет всю цепочку операций и диспатчит ответ на `endQueue`
/// Передает управление следующему узлу
///
/// - Parameter data: Данные для обработки
open func process(
Expand Down
4 changes: 2 additions & 2 deletions NodeKit/Layers/DTOProcessingLayer/RawEncoderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ open class RawEncoderNode<Input, Output>: AsyncNode where Input: RawEncodable {
}

/// Пытается конвертировать модель в RAW, а затем просто передает результат конвертации следующему узлу.
/// Если при конвертирвоании произошла ошибка - прерывает выполнение цепочки.
/// Если при конвертировании произошла ошибка - прерывает выполнение цепочки.
///
/// - Parameter data: Входящая модель.
open func process(_ data: Input) -> Observer<Output> {
Expand All @@ -34,7 +34,7 @@ open class RawEncoderNode<Input, Output>: AsyncNode where Input: RawEncodable {
}

/// Пытается конвертировать модель в RAW, а затем просто передает результат конвертации следующему узлу.
/// Если при конвертирвоании произошла ошибка - прерывает выполнение цепочки.
/// Если при конвертировании произошла ошибка - прерывает выполнение цепочки.
///
/// - Parameter data: Входящая модель.
open func process(
Expand Down
4 changes: 2 additions & 2 deletions NodeKit/Layers/InputProcessingLayer/DTOEncoderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ open class DTOEncoderNode<Input, Output>: AsyncNode where Input: DTOEncodable {
}

/// Пытается конвертировать модель в DTO, а затем просто передает результат конвертации следующему узлу.
/// Если при конвертирвоании произошла ошибка - прерывает выполнение цепочки.
/// Если при конвертировании произошла ошибка - прерывает выполнение цепочки.
///
/// - Parameter data: Входящая модель.
open func process(_ data: Input) -> Observer<Output> {
Expand All @@ -34,7 +34,7 @@ open class DTOEncoderNode<Input, Output>: AsyncNode where Input: DTOEncodable {
}

/// Пытается конвертировать модель в DTO, а затем просто передает результат конвертации следующему узлу.
/// Если при конвертирвоании произошла ошибка - прерывает выполнение цепочки.
/// Если при конвертировании произошла ошибка - прерывает выполнение цепочки.
///
/// - Parameter data: Входящая модель.
open func process(
Expand Down
10 changes: 6 additions & 4 deletions NodeKit/Layers/RequestBuildingLayer/URLQueryInjectorNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ open class URLQueryInjectorNode<Raw, Output>: AsyncNode {

/// Добавляет URL-query если может и передает управление следующему узлу.
/// В случае, если не удалось обработать URL, то возвращает ошибку `cantCreateUrlComponentsFromUrlString`
/// - SeeAlso: `URLQueryInjectorNodeError`
/// - SeeAlso: ``URLQueryInjectorNodeError``
open func process(_ data: RoutableRequestModel<UrlRouteProvider, Raw>) -> Observer<Output> {

guard !self.config.query.isEmpty else {
Expand Down Expand Up @@ -83,14 +83,16 @@ open class URLQueryInjectorNode<Raw, Output>: AsyncNode {

/// Добавляет URL-query если может и передает управление следующему узлу.
/// В случае, если не удалось обработать URL, то возвращает ошибку `cantCreateUrlComponentsFromUrlString`
/// - SeeAlso: `URLQueryInjectorNodeError`
/// - SeeAlso: ``URLQueryInjectorNodeError``
open func process(
_ data: RoutableRequestModel<UrlRouteProvider, Raw>,
logContext: LoggingContextProtocol
) async -> NodeResult<Output> {
return await .withMappedExceptions {
async let model = try transform(from: data)
return await next.process(data, logContext: logContext)
return try await transform(from: data)
.asyncFlatMap { result in
return await next.process(result, logContext: logContext)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ open class MultipartRequestCreatorNode<Output>: AsyncNode {
self.next = next
}

/// Конфигурирует низкоуровненвый запрос.
/// Конфигурирует низкоуровневый запрос.
///
/// - Parameter data: Данные для конфигурирования и последующей отправки запроса.
open func process(_ data: MultipartUrlRequest) -> Observer<Output> {
Expand All @@ -59,7 +59,7 @@ open class MultipartRequestCreatorNode<Output>: AsyncNode {
}
}

/// Конфигурирует низкоуровненвый запрос.
/// Конфигурирует низкоуровневый запрос.
///
/// - Parameter data: Данные для конфигурирования и последующей отправки запроса.
open func process(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ open class ResponseDataParserNode: AsyncNode {

/// Парсит ответ и в случае успеха передает управление следующему узлу.
///
/// - Parameter data: Модель овтета сервера.
/// - Parameter data: Модель ответа сервера.
open func process(_ data: UrlDataResponse) -> Observer<Json> {

let context = Context<Json>()
Expand Down Expand Up @@ -71,7 +71,7 @@ open class ResponseDataParserNode: AsyncNode {

/// Парсит ответ и в случае успеха передает управление следующему узлу.
///
/// - Parameter data: Модель овтета сервера.
/// - Parameter data: Модель ответа сервера.
open func process(
_ data: UrlDataResponse,
logContext: LoggingContextProtocol
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ open class ResponseHttpErrorProcessorNode<Type>: AsyncNode {
self.next = next
}

/// Сопосотавляет HTTP-коды с заданными и в случае их несовпадения передает управление дальше.
/// Сопоставляет HTTP-коды с заданными и в случае их несовпадения передает управление дальше.
/// В противном случае возвращает `HttpError`
///
/// - Parameter data: Модель ответа сервера.
Expand All @@ -66,7 +66,7 @@ open class ResponseHttpErrorProcessorNode<Type>: AsyncNode {
return self.next.process(data).log(Log(log, id: self.objectName, order: LogOrder.responseHttpErrorProcessorNode))
}

/// Сопосотавляет HTTP-коды с заданными и в случае их несовпадения передает управление дальше.
/// Сопоставляет HTTP-коды с заданными и в случае их несовпадения передает управление дальше.
/// В противном случае возвращает `HttpError`
///
/// - Parameter data: Модель ответа сервера.
Expand Down
8 changes: 4 additions & 4 deletions NodeKit/Layers/Utils/AccessSafe/TokenRefresherNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ open class TokenRefresherNode: AsyncNode {
private let arrayQueue = DispatchQueue(label: "TokenRefresherNode.observers")
private let flagQueue = DispatchQueue(label: "TokenRefresherNode.flag")

/// Иницицаллизирует
/// Инициаллизирует
///
/// - Parameter tokenRefreshChain: Цепочка для обновления токена.
/// - Parameter tokenRefresherActor: Актор для обновления токена.
Expand All @@ -39,7 +39,7 @@ open class TokenRefresherNode: AsyncNode {
self.observers = []
}

/// Иницицаллизирует
/// Инициаллизирует
///
/// - Parameter tokenRefreshChain: Цепочка для обновления токена.
public convenience init(tokenRefreshChain: any AsyncNode<Void, Void>) {
Expand All @@ -48,7 +48,7 @@ open class TokenRefresherNode: AsyncNode {

/// Проверяет, был ли отправлен запрос на обновление токена
/// Если запрос был отправлен, то создает `Observer`, сохраняет его у себя и возвращает предыдущему узлу.
/// Если нет - отплавляет запрос и сохраняет `Observer`
/// Если нет - отправляет запрос и сохраняет `Observer`
/// После того как запрос на обновление токена был выполнен успешно - эмитит данные во все сохраненные Observer'ы и удаляет их из памяти
open func process(_ data: Void) -> Observer<Void> {

Expand Down Expand Up @@ -100,7 +100,7 @@ open class TokenRefresherNode: AsyncNode {

/// Проверяет, был ли отправлен запрос на обновление токена
/// Если запрос был отправлен, то создает `Observer`, сохраняет его у себя и возвращает предыдущему узлу.
/// Если нет - отплавляет запрос и сохраняет `Observer`
/// Если нет - отправляет запрос и сохраняет `Observer`
/// После того как запрос на обновление токена был выполнен успешно - эмитит данные во все сохраненные Observer'ы и удаляет их из памяти
open func process(
_ data: Void,
Expand Down
4 changes: 2 additions & 2 deletions NodeKit/Utils/Logging/LoggerNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ open class LoggerNode<Input, Output>: AsyncNode {

/// Сразу же передает управление следующему узлу и подписывается на выполнение операций.
///
/// - Parameter data: Данные для обработки. Этот узел их не импользует.
/// - Parameter data: Данные для обработки. Этот узел их не использует.
open func process(_ data: Input) -> Observer<Output> {
let result = Context<Output>()

Expand Down Expand Up @@ -53,7 +53,7 @@ open class LoggerNode<Input, Output>: AsyncNode {

/// Сразу же передает управление следующему узлу и подписывается на выполнение операций.
///
/// - Parameter data: Данные для обработки. Этот узел их не импользует.
/// - Parameter data: Данные для обработки. Этот узел их не использует.
open func process(
_ data: Input,
logContext: LoggingContextProtocol
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,14 @@ final class MockerProxyConfigNodeTests: XCTestCase {
// then

let result = try XCTUnwrap(nextNodeMock.invokedProcessParameter)
let nextNodeUnwrappedResult = try XCTUnwrap(nextNodeResult)

XCTAssertEqual(nextNodeMock.invokedProcessCount, 1)
XCTAssertEqual(result.metadata[MockerProxyConfigKey.isProxyingOn], "\(isProxyingOn)")
XCTAssertEqual(result.metadata[MockerProxyConfigKey.proxyingHost], host)
XCTAssertEqual(result.metadata[MockerProxyConfigKey.proxyingScheme], scheme)
XCTAssertEqual(nextNodeResult?.metadata, expectedNextNodeResult.metadata)
XCTAssertEqual(nextNodeResult?.raw, expectedNextNodeResult.raw)
XCTAssertEqual(nextNodeUnwrappedResult.metadata, expectedNextNodeResult.metadata)
XCTAssertEqual(nextNodeUnwrappedResult.raw, expectedNextNodeResult.raw)
}

func testProcess_whenProxyIsOff_thenNodeAddRightKeys_andNextCalled() throws {
Expand All @@ -79,12 +81,14 @@ final class MockerProxyConfigNodeTests: XCTestCase {
// then

let result = try XCTUnwrap(nextNodeMock.invokedProcessParameter)
let nextNodeUnwrappedResult = try XCTUnwrap(nextNodeResult)

XCTAssertEqual(nextNodeMock.invokedProcessCount, 1)
XCTAssertNil(result.metadata[MockerProxyConfigKey.isProxyingOn])
XCTAssertNil(result.metadata[MockerProxyConfigKey.proxyingHost])
XCTAssertNil(result.metadata[MockerProxyConfigKey.proxyingScheme])
XCTAssertEqual(nextNodeResult?.metadata, expectedNextNodeResult.metadata)
XCTAssertEqual(nextNodeResult?.raw, expectedNextNodeResult.raw)
XCTAssertEqual(nextNodeUnwrappedResult.metadata, expectedNextNodeResult.metadata)
XCTAssertEqual(nextNodeUnwrappedResult.raw, expectedNextNodeResult.raw)
}

func testAsyncProcess_whenProxyIsOn_thenNodeAddRightKeys_andNextCalled() async throws {
Expand Down

0 comments on commit 2a6d2fc

Please sign in to comment.