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  }