This repository has been archived on 2026-02-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
swift-duct-calc/Sources/ViewController/Live.swift

135 lines
3.3 KiB
Swift

import Elementary
import ManualDCore
extension ViewController.Request {
func render() async throws -> AnySendableHTML {
switch route {
case .project(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .room(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .frictionRate(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .effectiveLength(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
default:
// FIX: FIX
return mainPage
}
}
}
extension SiteRoute.View.ProjectRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .index:
return MainPage(active: .projects) {
ProjectView(project: .mock)
}
case .form(let dismiss):
return ProjectForm(dismiss: dismiss)
case .create:
return mainPage
}
}
}
extension SiteRoute.View.RoomRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .form(let dismiss):
guard !dismiss else {
return div(.id("roomForm")) {}
}
return RoomForm()
case .index:
return MainPage(active: .rooms) {
RoomsView(rooms: Room.mocks)
}
}
}
}
extension SiteRoute.View.FrictionRateRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .index:
return MainPage(active: .frictionRate) {
FrictionRateView()
}
case .form(let type, let dismiss):
// FIX: Forms need to reference existing items.
switch type {
case .equipmentInfo:
return EquipmentForm(dismiss: dismiss)
case .componentPressureLoss:
return ComponentLossForm(dismiss: dismiss)
}
}
}
}
extension SiteRoute.View.FrictionRateRoute.FormType {
var id: String {
switch self {
case .equipmentInfo:
return "equipmentForm"
case .componentPressureLoss:
return "componentLossForm"
}
}
}
extension SiteRoute.View.EffectiveLengthRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .index:
return MainPage(active: .effectiveLength) {
EffectiveLengthsView(effectiveLengths: EffectiveLength.mocks)
}
case .form(let dismiss):
return EffectiveLengthForm(dismiss: dismiss)
case .field(let type):
switch type {
case .straightLength:
return StraightLengthField()
case .group:
return GroupField()
}
}
}
}
private let mainPage: AnySendableHTML = {
MainPage(active: .projects) {
div {
h1 { "It works!" }
}
}
}()
@Sendable
private func render<C: HTML>(
_ mainPage: (C) async throws -> AnySendableHTML,
_ isHtmxRequest: Bool,
@HTMLBuilder html: () -> C
) async rethrows -> AnySendableHTML where C: Sendable {
guard isHtmxRequest else {
return try await mainPage(html())
}
return html()
}
@Sendable
private func render<C: HTML>(
_ mainPage: (C) async throws -> AnySendableHTML,
_ isHtmxRequest: Bool,
_ html: @autoclosure @escaping () -> C
) async rethrows -> AnySendableHTML where C: Sendable {
try await render(mainPage, isHtmxRequest) { html() }
}