My file structure is as follows:
./booking-app
go.mod
main.go
/helper
go.mod
helper.go
./booking-app/main.go
package main
import (
"booking-app/helper"
"fmt"
"strings"
)
const conferenceTickets = 50
var conferenceName string = "Go Conference"
var remainingTickets uint = conferenceTickets
var bookings []string
func main() {
greetUsers()
for remainingTickets > 0 && len(bookings) < 50 {
firstName, lastName, email, userTickets := getUserInput()
isValidName, isValidEmail, isValidTickets := helper.ValidateUserInput(firstName, lastName, email, userTickets)
if isValidName && isValidEmail && isValidTickets {
bookTicket(userTickets, firstName, lastName, email)
firstNames := getFirstNames()
fmt.Printf("These are all our bookings: %v\n", firstNames)
if remainingTickets == 0 {
fmt.Println("Our conference is now fully booked. Come back next year!")
break
}
} else {
if !isValidName {
fmt.Println("First or last name is too short.")
}
if !isValidEmail {
fmt.Println("Your email needs and @ sign.")
}
if !isValidTickets {
fmt.Println("Invalid number of tickets.")
}
}
}
}
func greetUsers() {
fmt.Printf("Welcome to %s booking application.\n", conferenceName)
fmt.Printf("We have a total of %d tickets with %d available.\n", conferenceTickets, remainingTickets)
fmt.Println("Get your tickets here to attend.")
}
func getFirstNames() []string {
firstNames := []string{}
for _, booking := range bookings {
var names = strings.Fields(booking)
var firstName = names[0]
firstNames = append(firstNames, firstName)
}
return firstNames
}
func getUserInput() (string, string, string, uint) {
var firstName string
var lastName string
var email string
var userTickets uint
fmt.Println("Enter your first name:")
fmt.Scan(&firstName)
fmt.Println("Enter your last name:")
fmt.Scan(&lastName)
fmt.Println("Enter your email:")
fmt.Scan(&email)
fmt.Println("Enter number of tickets:")
fmt.Scan(&userTickets)
return firstName, lastName, email, userTickets
}
func bookTicket(userTickets uint, firstName string, lastName string, email string) {
remainingTickets = remainingTickets - userTickets
bookings = append(bookings, firstName+" "+lastName)
fmt.Printf("Thank you %s %s for booking %d tickets.\n", firstName, lastName, userTickets)
fmt.Printf("You will recieve a confirmation email soon at %s.\n", email)
fmt.Printf("%d tickets remaining for %s\n", remainingTickets, conferenceName)
}
./booking-app/go.mod
module booking-app
go 1.19
replace booking-app.com/helper => ./helper
require booking-app.com/helper v0.0.0-00010101000000-000000000000
./booking-app/helper/helper.go
package helper
import (
"strings"
)
func ValidateUserInput(firstName string, lastName string, email string, userTickets uint) (bool, bool, bool) {
isValidName := len(firstName) >= 2 && len(lastName) >= 2
isValidEmail := strings.Contains(email, "@")
isValidTickets := userTickets > 0 && userTickets <= RemainingTickets
return isValidName, isValidEmail, isValidTickets
}
./booking-app/helper/go.mod
module helper
go 1.19