github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter08/01_imperative/ex1.go (about) 1 package main 2 3 import ( 4 "fmt" 5 gc "github.com/go-goodies/go_currency" 6 ) 7 8 func main() { 9 orders := GetOrders() 10 for _, order := range orders { 11 fmt.Printf("Processed order: %v\n", Pipeline(*order)) 12 } 13 } 14 15 func Pipeline(o Order) Order { 16 o = Authenticate(o) 17 o = Decrypt(o) 18 o = Charge(o) 19 return o 20 } 21 22 23 func Authenticate(o Order) Order { 24 fmt.Printf("Order %d is Authenticated\n", o.OrderNumber) 25 return o 26 } 27 28 func Decrypt(o Order) Order { 29 fmt.Printf("Order %d is Decrypted\n", o.OrderNumber) 30 return o 31 } 32 33 func Charge(o Order) Order { 34 fmt.Printf("Order %d is Charged\n", o.OrderNumber) 35 return o 36 } 37 38 39 type Order struct { 40 OrderNumber int 41 IsValid bool 42 Credentials string 43 CCardNumber string 44 CCardExpDate string 45 LineItems []LineItem 46 } 47 48 type LineItem struct { 49 Description string 50 Count int 51 PriceUSD gc.USD 52 } 53 54 func GetOrders() []*Order { 55 56 order1 := &Order{ 57 10001, 58 true, 59 "alice,secret", 60 "7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=", 61 "0922", 62 []LineItem{ 63 LineItem{"Apples", 1, gc.USD{4, 50}}, 64 LineItem{"Oranges", 4, gc.USD{12, 00}}, 65 }, 66 } 67 68 order2 := &Order{ 69 10002, 70 true, 71 "bob,secret", 72 "EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=", 73 "0123", 74 []LineItem{ 75 LineItem{"Milk", 2, gc.USD{8, 00}}, 76 LineItem{"Sugar", 1, gc.USD{2, 25}}, 77 LineItem{"Salt", 3, gc.USD{3, 75}}, 78 }, 79 } 80 orders := []*Order{order1, order2} 81 return orders 82 }