import Dependencies import DependenciesMacros import Elementary import Logging import SharedModels public extension DependencyValues { var viewController: ViewController { get { self[ViewController.self] } set { self[ViewController.self] = newValue } } } public typealias AnySendableHTML = (any HTML & Sendable) @DependencyClient public struct ViewController: Sendable { public typealias AuthenticateHandler = @Sendable (User) -> Void public var view: @Sendable (Request) async throws -> AnySendableHTML @Sendable public func view( for route: ViewRoute, isHtmxRequest: Bool, logger: Logger, authenticate: @escaping AuthenticateHandler ) async throws -> AnySendableHTML { try await view(.init(route, isHtmxRequest: isHtmxRequest, authenticate: authenticate, logger: logger)) } public struct Request: Sendable { public let route: ViewRoute public let isHtmxRequest: Bool public let authenticate: AuthenticateHandler public let logger: Logger public init( _ route: ViewRoute, isHtmxRequest: Bool, authenticate: @escaping AuthenticateHandler, logger: Logger ) { self.route = route self.isHtmxRequest = isHtmxRequest self.authenticate = authenticate self.logger = logger } } } extension ViewController: TestDependencyKey { public static let testValue: ViewController = Self() }