import Vapor /// Represents a generic form context that is used to generate form templates /// that are handled by htmx. struct HtmxFormCTX: Content { let formClass: String? let formId: String let htmxPostTargetUrl: String? let htmxPutTargetUrl: String? let htmxTarget: String let htmxPushUrl: Bool let htmxResetAfterRequest: Bool let htmxSwapOob: String? let htmxSwap: String? let context: C init( formClass: String? = nil, formId: String, htmxTargetUrl: TargetUrl, htmxTarget: String, htmxPushUrl: Bool, htmxResetAfterRequest: Bool = true, htmxSwapOob: HtmxSwap? = nil, htmxSwap: HtmxSwap? = nil, context: C ) { self.formClass = formClass self.formId = formId self.htmxPostTargetUrl = htmxTargetUrl.postUrl self.htmxPutTargetUrl = htmxTargetUrl.putUrl self.htmxTarget = htmxTarget self.htmxPushUrl = htmxPushUrl self.htmxResetAfterRequest = htmxResetAfterRequest self.htmxSwapOob = htmxSwapOob?.rawValue self.htmxSwap = htmxSwap?.rawValue self.context = context } enum HtmxSwap: String { case innerHTML case outerHTML case afterbegin case beforebegin case afterend case beforeend case delete case none } enum TargetUrl { case put(String) case post(String) var putUrl: String? { guard case let .put(url) = self else { return nil } return url } var postUrl: String? { guard case let .post(url) = self else { return nil } return url } } } struct EmptyContent: Content {}