@@ -71,7 +71,27 @@ public extension HTMLElementAttribute {
71
71
case " disinherit " : self = . disinherit( string ( ) )
72
72
case " encoding " : self = . encoding( string ( ) )
73
73
case " ext " : self = . ext( string ( ) )
74
- //case "headers": self = .headers(js: Bool, [String : String]) // TODO: fix
74
+ case " headers " :
75
+ let values : [ Substring ] = rawValue. split ( separator: " , " )
76
+ let js : Bool = values [ 0 ] . hasSuffix ( " true " )
77
+ var headers_string : Substring = rawValue [ rawValue. firstIndex ( of: " [ " ) !... ]
78
+ headers_string. removeLast ( ) // )
79
+ let regex : Regex = try ! Regex ( " ( \" [^ \" ]+ \" ) " )
80
+ let matches : [ Range < Substring . Index > ] = headers_string. ranges ( of: regex)
81
+ var headers : [ String : String ] = [ : ]
82
+ var header_key : Substring = " "
83
+ for i in 0 ..< matches. count {
84
+ var value : Substring = headers_string [ matches [ i] ]
85
+ value. removeFirst ( ) // "
86
+ value. removeLast ( ) // "
87
+ if i % 2 == 0 {
88
+ header_key = value
89
+ } else {
90
+ headers [ String ( header_key) ] = String ( value)
91
+ }
92
+ }
93
+ self = . headers( js: js, headers)
94
+ break
75
95
case " history " : self = . history( enumeration ( ) )
76
96
case " historyElt " : self = . historyElt( boolean ( ) )
77
97
case " include " : self = . include( string ( ) )
@@ -117,7 +137,21 @@ public extension HTMLElementAttribute {
117
137
}
118
138
self = . request( js: javascript, timeout: timeout, credentials: credentials, noHeaders: noHeaders)
119
139
break
120
- //case "sync": self = .sync(String, strategy: SyncStrategy?) // TODO: fix
140
+ case " sync " :
141
+ let string : String = literal ( )
142
+ let values : [ Substring ] = string. split ( separator: " , " )
143
+ var key : Substring = values [ 0 ]
144
+ key. removeLast ( ) // "
145
+ var strategy : SyncStrategy ? = nil
146
+ var strategy_string : Substring = values [ 1 ] . split ( separator: " : " ) [ 1 ]
147
+ if !strategy_string. hasSuffix ( " nil " ) {
148
+ while ( strategy_string. first? . isWhitespace ?? false ) || strategy_string. first == " . " {
149
+ strategy_string. removeFirst ( )
150
+ }
151
+ strategy = SyncStrategy ( rawValue: String ( strategy_string) )
152
+ }
153
+ self = . sync( String ( key) , strategy: strategy)
154
+ break
121
155
case " validate " : self = . validate( enumeration ( ) )
122
156
123
157
case " get " : self = . get( string ( ) )
@@ -364,10 +398,6 @@ public extension HTMLElementAttribute.HTMX {
364
398
}
365
399
}
366
400
367
- // MARK: Modifiers
368
- enum Modifier {
369
- }
370
-
371
401
// MARK: Params
372
402
enum Params {
373
403
case all
@@ -418,6 +448,21 @@ public extension HTMLElementAttribute.HTMX {
418
448
case drop, abort, replace
419
449
case queue( Queue )
420
450
451
+ public init ? ( rawValue: String ) {
452
+ let values : [ Substring ] = rawValue. split ( separator: " ( " )
453
+ switch values [ 0 ] {
454
+ case " drop " : self = . drop
455
+ case " abort " : self = . abort
456
+ case " replace " : self = . replace
457
+ case " queue " :
458
+ guard let value_index: Substring . Index = values [ 1 ] . firstIndex ( where: { $0. isLetter } ) else { return nil }
459
+ let value : Substring = rawValue [ value_index..< values [ 1 ] . index ( before: values [ 1 ] . endIndex) ]
460
+ self = . queue( Queue ( rawValue: String ( value) ) !)
461
+ break
462
+ default : return nil
463
+ }
464
+ }
465
+
421
466
public enum Queue : String {
422
467
case first, last, all
423
468
}
@@ -427,7 +472,7 @@ public extension HTMLElementAttribute.HTMX {
427
472
case . drop: return " drop "
428
473
case . abort: return " abort "
429
474
case . replace: return " replace "
430
- case . queue( let queue) : return queue. rawValue
475
+ case . queue( let queue) : return " queue " + queue. rawValue
431
476
}
432
477
}
433
478
}
0 commit comments