refactored out passing service mode

Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
This commit is contained in:
Matt Bruce 2025-01-21 14:12:07 -06:00
parent 0f4cd465b1
commit 0f9515b90b
4 changed files with 58 additions and 10 deletions

View File

@ -10,7 +10,6 @@
public protocol EmployeeServiceProtocol {
/// This will get a list of all employees
/// - Parameter serviceMode: Mode in which to hit.
/// - Returns: An Employees struct
func getEmployees(_ serviceMode: EmployeeServiceMode) async throws -> Employees
func getEmployees() async throws -> Employees
}

View File

@ -7,11 +7,22 @@
import Foundation
/// These are the testing URL Endpoints for different states
public enum EmployeeServiceMode: String, CaseIterable {
internal enum EmployeeServiceMode: String, CaseIterable {
case production
case malformed
case empty
public var service: EmployeeServiceProtocol {
switch self {
case .production:
return EmployeeService.shared
case .malformed:
return EmployeeMalformedService.shared
case .empty:
return EmployeeEmptyService.shared
}
}
/// Enpoint in which to grabe employees from.
public var endpoint: String {
switch self {
@ -39,7 +50,45 @@ public class EmployeeService: EmployeeServiceProtocol {
/// This will get a list of all employees
/// - Parameter serviceMode: Mode in which to hit.
/// - Returns: An Employees struct
public func getEmployees(_ serviceMode: EmployeeServiceMode = .production) async throws -> Employees {
return try await NetworkService.shared.fetchData(from: serviceMode.endpoint, as: Employees.self)
public func getEmployees() async throws -> Employees {
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.production.endpoint, as: Employees.self)
}
}
/// Service Layer for Employees
public class EmployeeMalformedService: EmployeeServiceProtocol {
// MARK: - Properties
public static let shared = EmployeeMalformedService() // Default shared instance
// MARK: - Initializer
public init() {}
// MARK: - Public Methods
/// This will get a list of all employees
/// - Parameter serviceMode: Mode in which to hit.
/// - Returns: An Employees struct
public func getEmployees() async throws -> Employees {
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.malformed.endpoint, as: Employees.self)
}
}
/// Service Layer for Employees
public class EmployeeEmptyService: EmployeeServiceProtocol {
// MARK: - Properties
public static let shared = EmployeeEmptyService() // Default shared instance
// MARK: - Initializer
public init() {}
// MARK: - Public Methods
/// This will get a list of all employees
/// - Parameter serviceMode: Mode in which to hit.
/// - Returns: An Employees struct
public func getEmployees() async throws -> Employees {
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.empty.endpoint, as: Employees.self)
}
}

View File

@ -158,6 +158,6 @@ extension EmployeesViewController {
case 2: selectedMode = .empty
default: return
}
viewModel.changeMode(to: selectedMode)
viewModel.changeService(to: selectedMode.service)
}
}

View File

@ -11,7 +11,7 @@ import Foundation
/// specifically with the EmployeesViewController.
@MainActor
public class EmployeesViewModel: ObservableObject {
private var serviceMode: EmployeeServiceMode = .production
private var employeeService: EmployeeServiceProtocol = EmployeeService()
@Published public private(set) var employees: [Employee] = []
@Published public private(set) var errorMessage: String? = nil
@ -27,7 +27,7 @@ public class EmployeesViewModel: ObservableObject {
Task {
do {
// Fetch employees using the async method
let wrapper = try await EmployeeService.shared.getEmployees(serviceMode)
let wrapper = try await employeeService.getEmployees()
// Update published properties
employees = wrapper.employees
@ -43,8 +43,8 @@ public class EmployeesViewModel: ObservableObject {
}
public func changeMode(to mode: EmployeeServiceMode) {
serviceMode = mode
public func changeService(to employeeService: EmployeeServiceProtocol) {
self.employeeService = employeeService
fetchEmployees()
}
}