Skip to content

Commit ee3b5ee

Browse files
committed
Add logger level.
1 parent 37653f0 commit ee3b5ee

4 files changed

Lines changed: 83 additions & 26 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// CachedAsyncImageConfiguration.swift
3+
// CachedAsyncImage
4+
//
5+
// Created by Dmitry Kononchuk on 04.10.2023.
6+
// Copyright © 2023 Dmitry Kononchuk. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
/// CachedAsyncImage configuration.
12+
public final class CachedAsyncImageConfiguration {
13+
// MARK: - Public Properties
14+
15+
/// The singleton instance.
16+
///
17+
/// - Returns: The singleton `CachedAsyncImageConfiguration` instance.
18+
public static let shared = CachedAsyncImageConfiguration()
19+
20+
// MARK: - Private Properties
21+
22+
private(set) lazy var loggerLevel: LoggerLevel = .min
23+
24+
// MARK: - Public Enums
25+
26+
/// Logger level.
27+
public enum LoggerLevel {
28+
case min
29+
case max
30+
}
31+
32+
// MARK: - Private Initializers
33+
34+
private init() {}
35+
36+
// MARK: - Public Methods
37+
38+
/// Set logger level for debug.
39+
///
40+
/// - Parameter level: Logger level.
41+
/// Level `min`, only error messages are logged to the Xcode console.
42+
/// Level `max`, all messages are logged to the Xcode console.
43+
public func setLogger(with level: LoggerLevel) {
44+
loggerLevel = level
45+
}
46+
}

Sources/CachedAsyncImage/Services/ImageLoader.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ final class ImageLoader: ObservableObject {
6969
DispatchQueue.main.async {
7070
self?.errorMessage = error.rawValue
7171
}
72+
73+
#if DEBUG
74+
print("**** CachedAsyncImage error: \(error.rawValue)")
75+
#endif
7276
}
7377

7478
return Just(nil).eraseToAnyPublisher()

Sources/CachedAsyncImage/Services/NetworkManager.swift

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ enum NetworkError: LocalizedError {
1818
case transportError(Error)
1919

2020
// Received an bad response, e.g. non HTTP result.
21-
case badResponse(String)
21+
case badResponse(String = "Bad response.")
2222

2323
var rawValue: String {
2424
switch self {
@@ -71,24 +71,26 @@ final class NetworkManager: NetworkManagerProtocol {
7171
.mapError { NetworkError.transportError($0) }
7272
// Handle all other errors.
7373
.tryMap { element in
74-
let httpResponse = element.response as? HTTPURLResponse
75-
let statusCode = httpResponse?.statusCode ?? .zero
74+
guard let httpResponse = element
75+
.response as? HTTPURLResponse else {
76+
throw NetworkError.badResponse()
77+
}
7678

7779
#if DEBUG
78-
if let httpResponse = httpResponse {
79-
let message = """
80-
**** CachedAsyncImage response.
81-
From: \(httpResponse.url?.absoluteString ?? "")
82-
Status code: \(statusCode)
83-
"""
84-
85-
print(message)
86-
}
80+
if CachedAsyncImageConfiguration.shared.loggerLevel == .max {
81+
let message = """
82+
**** CachedAsyncImage response.
83+
Status code: \(httpResponse.statusCode),
84+
from: \(httpResponse.url?.absoluteString ?? "")
85+
"""
86+
87+
print(message.replacingOccurrences(of: "\n", with: " "))
88+
}
8789
#endif
8890

89-
guard statusCode == 200 else {
91+
guard (200...299).contains(httpResponse.statusCode) else {
9092
throw NetworkError.badResponse(
91-
"Bad response. Status code \(statusCode)"
93+
"Bad response. Status code: \(httpResponse.statusCode)"
9294
)
9395
}
9496

Sources/CachedAsyncImage/Views/CachedAsyncImage.swift

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,24 @@ extension CachedAsyncImage {
8989
if let uiImage = imageLoader.image {
9090
AnyView(image(uiImage))
9191
} else {
92-
if let error = error, let errorMessage = imageLoader.errorMessage {
93-
AnyView(error(errorMessage))
94-
} else {
95-
if let placeholder = placeholder {
96-
AnyView(placeholder())
97-
}
92+
errorOrPlaceholder
93+
}
94+
}
95+
96+
@ViewBuilder
97+
private var errorOrPlaceholder: some View {
98+
if let error = error, let errorMessage = imageLoader.errorMessage {
99+
AnyView(error(errorMessage))
100+
} else {
101+
if let placeholder = placeholder {
102+
AnyView(placeholder())
103+
}
104+
105+
if let placeholderWithProgress = placeholderWithProgress {
106+
let percentValue = Int((imageLoader.progress ?? .zero) * 100)
107+
let progress = String(percentValue)
98108

99-
if let placeholderWithProgress = placeholderWithProgress {
100-
let percentValue = Int((imageLoader.progress ?? .zero) * 100)
101-
let progress = String(percentValue)
102-
103-
AnyView(placeholderWithProgress(progress))
104-
}
109+
AnyView(placeholderWithProgress(progress))
105110
}
106111
}
107112
}

0 commit comments

Comments
 (0)