52 lines
897 B
Go
52 lines
897 B
Go
package utils
|
|
|
|
type TryChain[T any, V comparable] struct {
|
|
result T
|
|
error V
|
|
success V
|
|
}
|
|
|
|
func NewTry[T any, V comparable](success V) *TryChain[T, V] {
|
|
return &TryChain[T, V]{success: success}
|
|
}
|
|
|
|
func (c *TryChain[T, V]) Try(callback func() (T, V)) *TryChain[T, V] {
|
|
c.result, c.error = callback()
|
|
return c
|
|
}
|
|
|
|
func (c *TryChain[T, V]) Or(callback func() (T, V)) *TryChain[T, V] {
|
|
if c.error == c.success {
|
|
return c
|
|
}
|
|
return c.Try(callback)
|
|
}
|
|
|
|
func (c *TryChain[T, V]) Done() (T, V) {
|
|
return c.result, c.error
|
|
}
|
|
|
|
type TryChainErr struct {
|
|
err error
|
|
}
|
|
|
|
func NewTryErr() *TryChainErr {
|
|
return &TryChainErr{}
|
|
}
|
|
|
|
func (c *TryChainErr) Try(callback func() error) *TryChainErr {
|
|
c.err = callback()
|
|
return c
|
|
}
|
|
|
|
func (c *TryChainErr) Or(callback func() error) *TryChainErr {
|
|
if c.err == nil {
|
|
return c
|
|
}
|
|
return c.Try(callback)
|
|
}
|
|
|
|
func (c *TryChainErr) Done() error {
|
|
return c.err
|
|
}
|