Created
May 16, 2017 14:17
-
-
Save cardoso/e2d6074e1dba8000d07ddc706d51c369 to your computer and use it in GitHub Desktop.
Builder Pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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