-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
127 lines (98 loc) · 3.16 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"fmt"
"sync"
"time"
)
var conferenceName string = "Go Conference 2023"
const conferenceTickets int = 50
var remainingTickets uint = 50
var bookings = make([]UserData, 0)
type UserData struct {
firstName string
lastName string
email string
numberOfTickets uint
}
var wg = sync.WaitGroup{}
func main() {
greetUsers()
firstName, lastName, email, userTicket := getUserInputs()
isValidName, isValidEmail, isValidTicketNumber := validateUserInput(firstName, lastName, email, userTicket, remainingTickets)
if isValidName && isValidEmail && isValidTicketNumber {
bookTickets(userTicket, firstName, lastName, email)
wg.Add(1)
go sendEmail(userTicket, firstName, lastName, email)
firstNames := getFirstNames()
fmt.Printf("These are all our bookings: %v\n", firstNames)
if remainingTickets == 0 {
//end program
fmt.Println("Our tickets are sold out. Come back next year. ")
//break
}
} else {
if !isValidName {
fmt.Println("first name or last name you entered is too short")
}
if !isValidEmail {
fmt.Println("email address you entered doesn't contain @ sign")
}
if !isValidTicketNumber {
fmt.Println("number of tickets you entered is invalid")
}
}
wg.Wait()
}
func greetUsers() {
fmt.Printf("Welcome to %v BookingApp!!\n", conferenceName)
fmt.Println("Get your ticket now! ")
fmt.Printf("We have total of %v tickets and %v tickets are still left.\n", conferenceTickets, remainingTickets)
}
func getFirstNames() []string {
firstNames := []string{}
for _, booking := range bookings {
firstNames = append(firstNames, booking.firstName)
}
return firstNames
}
func getUserInputs() (string, string, string, uint) {
var firstName string
var lastName string
var email string
var userTicket uint
fmt.Println("Please enter your name: ")
fmt.Scanln(&firstName)
fmt.Println("Enter your last name: ")
fmt.Scanln(&lastName)
fmt.Println("Enter your email:")
fmt.Scanln(&email)
fmt.Println("Please enter number of ticket you want:")
fmt.Scanln(&userTicket)
return firstName, lastName, email, userTicket
}
func bookTickets(userTicket uint, firstName string, lastName string, email string) {
remainingTickets = remainingTickets - uint(userTicket)
var userData = UserData{
firstName: firstName,
lastName: lastName,
email: email,
numberOfTickets: userTicket,
}
// //create a map
// user["firstName"] = firstName
// user["lastName"] = lastName
// user["email"] = email
// user["numberOfTickets"] = strconv.FormatUint(uint64(userTicket), 10)
bookings = append(bookings, userData)
fmt.Printf("List of booking is %v\n", bookings)
fmt.Printf("User %v booked %v tickets, and its confirmation is sent to %v.\n", firstName, userTicket, email)
fmt.Printf("%v tickets remaining of %v\n", remainingTickets, conferenceName)
}
func sendEmail(userTickets uint, firstName string, lastName string, email string) {
time.Sleep(10 * time.Second)
var ticket = fmt.Sprintf("%v tickets for %v %v", userTickets, firstName, lastName)
fmt.Println("#################")
fmt.Printf("Sending ticket:\n %v \n to email address %v\n", ticket, email)
fmt.Printf("##################")
wg.Done()
}