Routing
let routes: [String: Component] =
"/something": someComponent,
"/anotherPath": anotherComponent,
"*": mainComponent]
let appServer = BlameworkAppServer(routes: routes)
Slide 17
Slide 17 text
Routing
let component = routes[request.path] ?? routes["*"]!
return component.renderFor(request: request)
Slide 18
Slide 18 text
Presentation
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
html.head {
html.title("Blamework demo")
}
html.body { html in
html.p("My TODO list for today:")
html.form { html in
html.textField("item")
html.submit("Add Item")
}
html.ol { html in
for e in items {
html.li(e)
}
}
}
Slide 22
Slide 22 text
A domain-specific language (DSL) is a
computer language specialized to a
particular application domain.
— h$ps://en.wikipedia.org/wiki/Domain-specific_language
Slide 23
Slide 23 text
Swift vs. Ruby
Slide 24
Slide 24 text
html.head {
html.title("Blamework demo")
}
html.body { html in
html.p("My TODO...:")
html.form { html in
html.textField("item")
html.submit("Add Item")
}
html.ol { html in
for e in items {
html.li(e)
}
}
}
extension PersistentObject {
func toDictionary() -> [String:Any] {
let result = gen(value: self)
if let result = result as? [String:Any] {
return result
} else {
return [String:Any]()
}
}
func gen(value: Any) -> Any {//...}
}
Slide 41
Slide 41 text
Reflection + Mirror
func gen(value: Any) -> Any {
let m = Mirror(reflecting: value)
if m.displayStyle == .struct {
var result = [String:Any]()
for case let (label?, value) in m.children {
result[label] = gen(value: value)
}
return result
} else {
return value
}
}
Slide 42
Slide 42 text
extension Array where Element: PersistentObject {
func write(to: String) -> Bool {
let array = map {$0.toDictionary()} as NSArray
return array.write(to: URL(fileURLWithPath: to), atomically: true)
}
}
extension Dictionary where Value: PersistentObject {
func write(to: String) -> Bool {
var dict = [Key:[String:Any]]()
for (k, v) in self {
dict[k] = v.toDictionary()
}
let dict2 = dict as NSDictionary
return dict2.write(to: URL(fileURLWithPath: to), atomically: true)
}
}
Slide 43
Slide 43 text
struct Address {
var line1: String
var line2: String
var zipCode: Int
}
func gen(value: Any) -> Any {
let m = Mirror(reflecting: value)
if m.displayStyle == .struct {
var result = [String:Any]()
for case let (label?, value) in m.children {
result[label] = gen(value: value)
}
return result
} else {
return value
}
}
Slide 50
Slide 50 text
for case let (label?, value) in m.children {
result[label] = gen(value: value)
}
Slide 51
Slide 51 text
var nums: [Int?] = [1, 2, 3, nil, 5]
for e in nums {
print("Value: ", e)
}
Value: Optional(1)
Value: Optional(2)
Value: Optional(3)
Value: nil
Value: Optional(5)
Slide 52
Slide 52 text
var nums: [Int?] = [1, 2, 3, nil, 5]
for case let e? in nums {
print("Value: ", e)
}
Value: 1
Value: 2
Value: 3
Value: 5
var nums: [Int?] = [1, 2, 3, nil, 5]
for case let e? in nums {
print("Value: ", e)
}
for e in nums.flatMap({$0}) {
print("Value: ", e)
}
Value: 1
Value: 2
Value: 3
Value: 5
Slide 55
Slide 55 text
Javascript
Slide 56
Slide 56 text
let routes: [String: Component] =
["/scripts/turbolinks.js":
FileComponent(path: "/path/to/turbolinks.js"),
//...
]
Slide 57
Slide 57 text
html.head { html in
html.title("Blamework demo")
html.script(src: "/scripts/turbolinks.js")
}
Slide 58
Slide 58 text
More
Slide 59
Slide 59 text
extension Array where Element: PersistentObject {
func write(to: String) -> Bool {
let array = map {$0.toDictionary()} as NSArray
return array.write(to: URL(fileURLWithPath: to),
atomically: true)
}
}
Slide 60
Slide 60 text
extension Collection where Iterator.Element: PersistentObject { }
extension Collection where Iterator.Element == PersistentObject { }
Slide 61
Slide 61 text
extension Collection where Iterator.Element: PersistentObject { }
// var list: [PersistentObject]
// this is NOT what I want ^
extension Collection where Iterator.Element == PersistentObject { }
// var list: [SomeTypeThatImplementsPersistentObject]
//e.g
// var list: [Addresses]
// this is what I want for PersistentObject^