name.go (32 lines of code) (raw):

package flow import "fmt" // Name can rename a Step. // // workflow.Add( // Step(a), // Name(a, "StepA"), // ) // // Attention: Name will wrap the original Step func Name(step Steper, name string) Builder { return Step(&NamedStep{Name: name, Steper: step}) } // Names can rename multiple Steps. // // workflow.Add( // Names(map[Steper]string{ // stepA: "A", // stepB: "B", // }, // ) func Names(m map[Steper]string) Builder { as := AddSteps{} for step, name := range m { as[&NamedStep{name, step}] = nil } return as } // NameFunc can rename a Step with a runtime function. func NameFunc(step Steper, fn func() string) Builder { return NameStringer(step, stringer(fn)) } // NameStringer can rename a Step with a fmt.Stringer, // which allows String() method to be called at runtime. func NameStringer(step Steper, name fmt.Stringer) Builder { return Step(&StringerNamedStep{Name: name, Steper: step}) } // NamedStep is a wrapper of Steper, it gives your step a name by overriding String() method. type NamedStep struct { Name string Steper } func (ns *NamedStep) String() string { return ns.Name } func (ns *NamedStep) Unwrap() Steper { return ns.Steper } type stringer func() string func (s stringer) String() string { return s() } type StringerNamedStep struct { Name fmt.Stringer Steper } func (sns *StringerNamedStep) String() string { return sns.Name.String() } func (sns *StringerNamedStep) Unwrap() Steper { return sns.Steper }