Polaris helps you create, store and run workflows. A workflow is a series of multiple steps, and can often be long running.
You don't need to worry about:
- Sequence of steps (it will figure out which the sequence along with the ones that can run concurrently)
- Explicitly pausing workflows (when it runs out of new data to move the workflow ahead, it pauses)
Polaris is especially useful for payments, e-commerce and fulfilment use cases. Consider a payment gateway trying to process payments via cards and netbanking.
Often, a lot of the logic would overlap - such as invoicing, settlements, etc. Polaris can neatly structure your code, making it more maintainable than ever.
| type CardPaymentWorkflow struct{}
func (w CPW) GetWorkflowMeta() WorkflowMeta {
    return WorkflowMeta{
        Builders: []IBuilder{
            InitiateReq{},
            EncryptCardInfo{},
            TokenizeCard{},
            ProcessPayment{},
            OTPVerification{},
            PaymentComplete{},
            GenerateInvoice{},
        },
        TargetData: PaymentCompletedData{},
    }
} | type NetbankingPaymentWorkflow struct{}
func (w NPW) GetWorkflowMeta() WorkflowMeta {
    return WorkflowMeta{
        Builders: []IBuilder{
            InitiateReq{},
            FetchBankRedirectURL{},
            RedirectAndCollect{},
            ProcessBankPayment{},
            OTPVerification{},
            PaymentComplete{},
            GenerateInvoice{},
        },
        TargetData: PaymentCompletedData{},
    }
} | 
Each builder (workflow's unit of work) would maintain and process some logic, which can be reused across multiple workflows.
For example,
type TokenizeCard struct {
    TokenService TokenService
    DB           TokenStore
}
func (b TokenizeCard) GetBuilderInfo() BuilderInfo {
    return BuilderInfo{
        Consumes: []IData{ EncryptedCardData{} },
        Produces: CardTokenData{},
    }
}
func (b TokenizeCard) Process(ctx BuilderContext) IData {
    enc := ctx.Get(EncryptedCardData{})
    token := b.TokenService.Generate(enc)
    b.DB.Save(token)
    return CardTokenData{ Token: token }
}For more details, dive into the docs!