Documentation
¶
Overview ¶
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func IntDiv(a, b int) rst.Result[int] {
if b == 0 {
return rst.Err[int](errors.New("oops! illegal division"))
}
return rst.Ok(a / b)
}
func main() {
num := IntDiv(-4, 2).Unwrap()
fmt.Println(num)
// you may also use rst.Match(func, ok, err)
num2 := IntDiv(2, 0).Match(
func(n int) int {
return n
},
func(err error) int {
fmt.Println(err)
return 0
},
)
fmt.Println(num2)
}
Output: -2 oops! illegal division 0
Index ¶
- func Match[T any](r Result[T], ok func(T) T, err func(error) T) T
- type Result
- func (r Result[T]) Expect(msg string) T
- func (r Result[T]) ExpectErr(msg string) error
- func (r Result[T]) IsErr() bool
- func (r Result[T]) IsErrAnd(fn func(error) bool) bool
- func (r Result[T]) IsOk() bool
- func (r Result[T]) IsOkAnd(fn func(T) bool) bool
- func (r Result[T]) Map(fn func(T) T) Result[T]
- func (r Result[T]) MapOr(value T, fn func(T) T) T
- func (r Result[T]) Match(ok func(T) T, err func(error) T) T
- func (r Result[T]) Unwrap() T
- func (r Result[T]) UnwrapErr() error
- func (r Result[T]) UnwrapOr(value T) T
- func (r Result[T]) UnwrapOrDefault() T
- func (r Result[T]) UnwrapOrElse(fn func() T) T
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Match ¶
Match cases between an Ok value and an Err value and consume value from cases
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func IntDiv(a, b int) rst.Result[int] {
if b == 0 {
return rst.Err[int](errors.New("oops! illegal division"))
}
return rst.Ok(a / b)
}
func main() {
num := rst.Match(IntDiv(-4, 2),
func(n int) int {
return n * -1
},
func(err error) int {
return 0
},
)
fmt.Println(num)
}
Output: 2
Types ¶
type Result ¶
type Result[T any] struct { // contains filtered or unexported fields }
func (Result[T]) Expect ¶
Return the contained Ok value or panic with a custom message
Example ¶
package main
import (
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
num1 := rst.Ok(2).Expect("custom message")
fmt.Println(num1)
// panics with "custom message"
// num2 := rst.Err[int]("error")).Expect("custom message")
}
Output: 2
func (Result[T]) ExpectErr ¶
Return the contained Err value or panic if result is Ok with a custom error message and its value
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
someErrorType := errors.New("some error message")
err := rst.Err[int](someErrorType).ExpectErr("Ok value panic")
if errors.Is(err, someErrorType) {
fmt.Println(err)
}
// panics with "Ok value panic"
// err := rst.Ok(10).ExpectErr("Ok value panic")
}
Output: some error message
func (Result[T]) IsErr ¶
Returns true if the result is Err
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
rstOk := rst.Ok(5)
fmt.Println(rstOk.IsErr())
rstErr := rst.Err[int](errors.New("some error message"))
fmt.Println(rstErr.IsErr())
}
Output: false true
func (Result[T]) IsErrAnd ¶
Returns true if the result is Err and its value matches an evaluated function
Example ¶
package main
import (
"errors"
"fmt"
"os"
rst "codeberg.org/whou/goresult"
)
func FileInfo(name string) rst.Result[os.FileInfo] {
file, err := os.Stat(name)
if err != nil {
return rst.Err[os.FileInfo](err)
}
return rst.Ok(file)
}
func main() {
// result is Err and the function returns true
file1 := FileInfo("non-existent").IsErrAnd(func(err error) bool {
return errors.Is(err, os.ErrNotExist)
})
fmt.Println(file1)
// result is Err but the function returns false
file2 := FileInfo("non-existent").IsErrAnd(func(err error) bool {
return errors.Is(err, os.ErrPermission)
})
fmt.Println(file2)
// result is Ok
file3 := rst.Ok(123).IsErrAnd(func(err error) bool {
return errors.Is(err, os.ErrNotExist)
})
fmt.Println(file3)
}
Output: true false false
func (Result[T]) IsOk ¶
Returs true if the result is Ok
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
rstOk := rst.Ok(5)
fmt.Println(rstOk.IsOk())
rstErr := rst.Err[int](errors.New("some error message"))
fmt.Println(rstErr.IsOk())
}
Output: true false
func (Result[T]) IsOkAnd ¶
Returns true if the result is Ok and its value matches an evaluated function
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
ten := rst.Ok(10).IsOkAnd(func(i int) bool {
return i > 5
})
fmt.Println(ten)
four := rst.Ok(4).IsOkAnd(func(i int) bool {
return i > 5
})
fmt.Println(four)
numErr := rst.Err[int](errors.New("error")).IsOkAnd(func(i int) bool {
return i > 5
})
fmt.Println(numErr)
}
Output: true false false
func (Result[T]) Map ¶
Maps the result by applying a function to the Ok value
Example ¶
package main
import (
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
phrase := "Result[T] is awesome!"
count := rst.Ok(phrase).Map(func(s string) string {
return fmt.Sprint(len(phrase))
})
fmt.Println(count.Unwrap())
}
Output: 21
func (Result[T]) MapOr ¶
func (r Result[T]) MapOr(value T, fn func(T) T) T
Return the provided default if Err or apply a function to the contained Ok value
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
phrase := "Result[T] is awesome!"
count := rst.Ok(phrase).MapOr("unable to map", func(s string) string {
return fmt.Sprint(len(phrase))
})
fmt.Println(count)
count2 := rst.Err[string](errors.New("error")).MapOr("unable to map", func(s string) string {
return fmt.Sprint(len(phrase))
})
fmt.Println(count2)
}
Output: 21 unable to map
func (Result[T]) Match ¶
Match cases between an Ok value and an Err value and consume value from cases
func (Result[T]) Unwrap ¶
func (r Result[T]) Unwrap() T
Return the contained Ok value or panic with a generic error
Example ¶
package main
import (
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
num1 := rst.Ok(2).Unwrap()
fmt.Println(num1)
// panics with "error"
// num2 := rst.Err[int]("error").Unwrap()
}
Output: 2
func (Result[T]) UnwrapErr ¶
Return the contained Err value or panic if result is Ok with its value
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
someErrorType := errors.New("some error message")
err := rst.Err[int](someErrorType).UnwrapErr()
if errors.Is(err, someErrorType) {
fmt.Println(err)
}
// panics
// err := rst.Ok(10).UnwrapErr()
}
Output: some error message
func (Result[T]) UnwrapOr ¶
func (r Result[T]) UnwrapOr(value T) T
Return the contained Ok value or a provided default value
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func main() {
num := rst.Err[int](errors.New("some error message")).UnwrapOr(1)
fmt.Println(num)
}
Output: 1
func (Result[T]) UnwrapOrDefault ¶
func (r Result[T]) UnwrapOrDefault() T
Return the contained Ok value or return the default value from T
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func IntDiv(a, b int) rst.Result[int] {
if b == 0 {
return rst.Err[int](errors.New("oops! illegal division"))
}
return rst.Ok(a / b)
}
func main() {
num1 := IntDiv(20, 5).UnwrapOrDefault()
fmt.Println(num1)
// int type default value is 0
num2 := IntDiv(20, 0).UnwrapOrDefault()
fmt.Println(num2)
}
Output: 4 0
func (Result[T]) UnwrapOrElse ¶
func (r Result[T]) UnwrapOrElse(fn func() T) T
Return the contained Ok value or return the evaluated function
Example ¶
package main
import (
"errors"
"fmt"
rst "codeberg.org/whou/goresult"
)
func IntDiv(a, b int) rst.Result[int] {
if b == 0 {
return rst.Err[int](errors.New("oops! illegal division"))
}
return rst.Ok(a / b)
}
func main() {
num1 := IntDiv(20, 5).UnwrapOrElse(func() int {
return -1
})
fmt.Println(num1)
num2 := IntDiv(20, 0).UnwrapOrElse(func() int {
return -1
})
fmt.Println(num2)
}
Output: 4 -1