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 typealias CurrentUserHandler = @Sendable () throws -> User public var view: @Sendable (Request) async throws -> AnySendableHTML @Sendable public func view( for route: SiteRoute.View, isHtmxRequest: Bool, logger: Logger, authenticate: @escaping AuthenticateHandler, currentUser: @escaping CurrentUserHandler ) async throws -> AnySendableHTML { try await view(.init( route, isHtmxRequest: isHtmxRequest, authenticate: authenticate, logger: logger, currentUser: currentUser )) } public struct Request: Sendable { public let route: SiteRoute.View public let isHtmxRequest: Bool public let authenticate: AuthenticateHandler public let logger: Logger public let currentUser: CurrentUserHandler public init( _ route: SiteRoute.View, isHtmxRequest: Bool, authenticate: @escaping AuthenticateHandler, logger: Logger, currentUser: @escaping CurrentUserHandler ) { self.route = route self.isHtmxRequest = isHtmxRequest self.authenticate = authenticate self.logger = logger self.currentUser = currentUser } } } extension ViewController: TestDependencyKey { public static let testValue: ViewController = Self() }