Skip to content

Instantly share code, notes, and snippets.

@cardoso
Created May 16, 2017 14:17
Show Gist options
  • Save cardoso/e2d6074e1dba8000d07ddc706d51c369 to your computer and use it in GitHub Desktop.
Save cardoso/e2d6074e1dba8000d07ddc706d51c369 to your computer and use it in GitHub Desktop.
Builder Pattern
import Vapor
import Foundation
import FluentProvider
protocol Builder {
associatedtype T
typealias BuilderClosure = (Self) -> ()
init()
static func build(buildClosure: BuilderClosure?) -> T
func build(buildClosure: BuilderClosure?) -> T
func finish() -> T
}
extension Builder {
static func build(buildClosure: BuilderClosure? = nil) -> T {
return Self().build(buildClosure: buildClosure)
}
func build(buildClosure: BuilderClosure? = nil) -> T {
buildClosure?(self)
return finish()
}
}
import Vapor
import Foundation
import FluentProvider
final class UserBuilder: Builder {
typealias T = User
func uniqueUsername() {
self.username = UUID().uuidString
}
var username: String = "anyUsername"
var password: String = "anyPassword"
func finish() -> User {
let user = User(name: username, password: password)
return user
}
}
final class TeamBuilder: Builder {
typealias T = Team
var name: String = "anyName"
func finish() -> Team {
return Team(name: name)
}
}
final class TeamMembershipBuilder: Builder {
typealias T = TeamMembership?
var userid: Identifier?
var teamid: Identifier?
func finish() -> TeamMembership? {
if let userid = userid, let teamid = teamid {
return TeamMembership(teamid: teamid, userid: userid)
}
return nil
}
}
final class RoleBuilder: Builder {
typealias T = Role
var name: String = "anyName"
var readableName: String = "anyReadableName"
func finish() -> Role {
return Role(name: name, readableName: readableName)
}
}
final class RoleAssignmentBuilder: Builder {
typealias T = RoleAssignment?
var userid: Identifier?
var roleid: Identifier?
func finish() -> RoleAssignment? {
if let userid = userid, let roleid = roleid {
return RoleAssignment(roleid: roleid, userid: userid)
}
return nil
}
}
let user = UserBuilder.build {
$0.username = "testUser"
$0.password = "password"
}
try user.save()
let team = TeamBuilder.build {
$0.name = name
}
try team.save()
let membership = TeamMembershipBuilder.build {
$0.teamid = team.id
$0.userid = user.id
}
try membership.save()
let role = RoleBuilder.build {
$0.name = "admin"
$0.readableName = "Administrator"
}
try role.save()
let assignment = RoleAssignmentBuilder.build {
$0.roleid = role.id
$0.userid = user.id
}
try assignment.save()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment