Building a Rule Engine for a Loyalty Program in Golang

📚 3 min read Tweet this post

Loyalty programs are an essential part of many businesses, and they help to keep customers engaged and loyal. A loyalty program typically rewards customers with points or other incentives for their continued patronage. These points can then be redeemed for discounts, free products, or other benefits. However, managing a loyalty program can be challenging, especially when it comes to calculating and validating points.

In this article, we will discuss how to build a simple rule engine for a loyalty program in Golang. We will create an interface that defines the rules for validating and calculating points based on a set of events. We will then implement this interface and demonstrate how it can be used to validate and calculate points for a loyalty program.

Before we can start building our rule engine, we need to define an interface that describes the rules for validating and calculating points. The interface should include the following methods:

  • Validate(event Event) bool: This method should take an event and return true if the event is valid, or false if it is not valid.
  • Calculate(event Event) (int, error): This method should take an event and return the number of points that should be awarded for the event.

We can define this interface as follows:

type RuleEngine interface {
	Validate(event Event) bool
	Calculate(event Event) (int, error)
}

type Event struct {
	Data map[string]interface{}
}

Now that we have defined our interface, we can start implementing our rule engine. Our rule engine will take a set of events and apply a set of rules to determine the number of points that should be awarded for each event.

To demonstrate how this works, let’s create a simple example. Assume that we have a loyalty program that awards 10 points for every purchase over $50, and 5 points for every purchase over $25. We can define the rules for this program as follows:

type SimpleRule struct{}

func (engine *SimpleRule) Validate(event *Event) bool {
	// Our loyalty program does not have any specific validation rules.
	return true
}

func (engine *SimpleRule) Calculate(event *Event) (int, error) {
	// Calculate the number of points awarded based on the total purchase amount.
	purchaseAmount, ok := event.Data["amount"].(float64)
	if !ok {
		return 0, errors.New("invalid amount")
	}
	var points int
	if purchaseAmount > 50 {
		points = 10
	} else if purchaseAmount > 25 {
		points = 5
	}
	return points, nil
}

In this example, we have defined the SimpleRule struct, which implements the RuleEngine interface. We have implemented the Validate method to always return true since our loyalty program does not have any specific validation rules then implemented the Calculate method to calculate the number of points that should be awarded based on the total purchase amount.

Now that we have implemented our rule engine, we can use it to validate and calculate points for a loyalty program. To demonstrate how this works, let’s create a simple loyalty program that awards points for purchases.


func main() {
	// Create a loyalty rule engine.
	engine := &SimpleRule{}

	// Create a purchase event.
	event := &Event{
		Data: map[string]interface{}{
			"amount": 75.0,
		},
	}

	// Validate the event and calculate the points.
	if engine.Validate(event) {
		points, _ := engine.Calculate(event)
		fmt.Println("Points awarded:", points)
	}
}

In this example, we have created a Event struct that includes the total purchase amount. We have then created an instance of the SimpleRule and a Event, and we have called the Validate and Calculate methods on the engine to determine the number of points that should be awarded for the purchase. Finally, we have printed the number of points that were awarded. Try it yourself and try to modify the rules https://go.dev/play/p/3Fa7pdw7aBQ.

While this example is relatively simple, you can extend this approach to handle more complex loyalty programs. You can define additional rules for validating and calculating points, and you can combine multiple rules to create more sophisticated loyalty programs. Overall, building a rule engine for a loyalty program in Golang can help you to manage your loyalty program more efficiently and effectively.

practical go