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: Context init( formClass: String? = nil, formId: String, htmxTargetUrl: TargetUrl, htmxTarget: String, htmxPushUrl: Bool, htmxResetAfterRequest: Bool = true, htmxSwapOob: HtmxSwap? = nil, htmxSwap: HtmxSwap? = nil, context: Context ) { 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 {} struct ButtonLabelContext: Content { let buttonLabel: String } extension HtmxFormCTX where Context == ButtonLabelContext { init( formClass: String? = nil, formId: String, htmxTargetUrl: TargetUrl, htmxTarget: String, htmxPushUrl: Bool, htmxResetAfterRequest: Bool = true, htmxSwapOob: HtmxSwap? = nil, htmxSwap: HtmxSwap? = nil, buttonLabel: String ) { self.init( formClass: formClass, formId: formId, htmxTargetUrl: htmxTargetUrl, htmxTarget: htmxTarget, htmxPushUrl: htmxPushUrl, htmxResetAfterRequest: htmxResetAfterRequest, htmxSwapOob: htmxSwapOob, htmxSwap: htmxSwapOob, context: .init(buttonLabel: buttonLabel) ) } }