Thanks to visit codestin.com
Credit goes to github.com

Skip to content
/ nilo Public

Rusty Go Option library for handling nil values, some errors and marshaling

License

javiorfo/nilo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nilo

Rusty Go Option library for handling nil values, some errors and marshaling

Caveats

  • This library requires Go 1.23+

Intallation

go get -u github.com/javiorfo/nilo@latest

Example

Examples here

package main

import (
  "errors"
  "fmt"

  "github.com/javiorfo/nilo"
)

type User struct {
  Name string
}

// Implements nilo.Default interface
func (u User) Default() User {
  return User{"Default Implementation"}
}

func main() {
  var optUser = nilo.None[User]()

  fmt.Printf("User or default: %+v\n", optUser.UnwrapOrDefault())
  fmt.Printf("User or: %+v\n", optUser.UnwrapOr(*new(User)))
  fmt.Printf("User or else: %+v\n", optUser.UnwrapOrElse(func() User { return User{"else"} }))
  fmt.Printf("Map or: %+v\n", optUser.MapOr(User{"or"}, func(u User) User {
	  u.Name = "something"
	  return u
  }))

  nilo.FromResult(getUser(true)).OkAndResult(getUser2).Inspect(print)

  _, err := test(false).OkOr(errors.New("some err"))
  fmt.Println("Error:", err.Error())

  fmt.Println(test(true).MapToString(func(v string) string { return v + ", World" }).UnwrapOr("another string"))
}

func test(b bool) nilo.Option[string] {
  if b {
	  return nilo.Some("Hello")
  }
  return nilo.None[string]()
}

func print[T any](v *T) {
  fmt.Printf("Value: %#v\n", *v)
}

func getUser(b bool) (*int, error) {
  if b {
	  i := 1
	  return &i, nil
  }
  return nil, errors.New("error")
}

func getUser2(v *int) (*int, error) {
  if *v == 0 {
	  return nil, errors.New("error")
  }
  i := *v + 2
  return &i, nil
}

JSON marshal

package main

import (
  "encoding/json"
  "fmt"

  "github.com/javiorfo/nilo"
)

type User struct {
  Name string              `json:"name"`
  Code nilo.Option[string] `json:"code"`
}

func main() {
  var unmarshalUser User
  user := User{
	  Name: "Name",
	  Code: nilo.None[string](),
  }

  // Marshal
  jsonData, err := json.MarshalIndent(user, "", "  ")
  if err != nil {
	  fmt.Println("Error marshaling to JSON:", err)
	  return
  }

  fmt.Println(string(jsonData))
	
  // Unmarshal
  err = json.Unmarshal(jsonData, &unmarshalUser)
  if err != nil {
	  fmt.Println("Error unmarshaling:", err)
	  return
  }
	
  fmt.Printf("Unmarshaled User: %+v\n", unmarshalUser)
  if unmarshalUser.Code.IsNone() {
	  fmt.Printf("Code is None: %s\n", unmarshalUser.Code)
  }

  // Put Some in Code
  user.Code.Replace("some code")

  // Marshal
  jsonData, err = json.MarshalIndent(user, "", "  ")
  if err != nil {
	  fmt.Println("Error marshaling to JSON:", err)
	  return
  }

  fmt.Println(string(jsonData))

  // Unmarshal
  err = json.Unmarshal(jsonData, &unmarshalUser)
  if err != nil {
	  fmt.Println("Error unmarshaling:", err)
	  return
  }
	
  fmt.Printf("Unmarshaled User: %+v\n", unmarshalUser)
  if unmarshalUser.Code.IsSome() {
	  fmt.Printf("Code is Some with value: %s\n", unmarshalUser.Code.Unwrap())
  }
}

All methods

func (o Option[T]) Unwrap() T
func (o Option[T]) UnwrapOr(other T) T
func (o Option[T]) UnwrapUnchecked() *T
func (o Option[T]) UnwrapOrDefault() T
func (o Option[T]) UnwrapOrElse(supplier func() T) T
func (o Option[T]) OkOr(err error) (*T, error)
func (o Option[T]) OkOrElse(err func() error) (*T, error)
func (o Option[T]) OrElse(supplier func() Option[T]) Option[T]
func (o Option[T]) Filter(filter func(T) bool) Option[T]
func (o Option[T]) IsNone() bool
func (o Option[T]) IsSome() bool
func (o Option[T]) Inspect(consumer func(T)) Option[T]
func (o Option[T]) InspectOrElse(consumer func(T), or func())
func None[T any]() Option[T]
func Some[T any](value T) Option[T]
func SomePtr[T any](value *T) Option[T]
func (o Option[T]) AndThen(fn func(T) Option[T]) Option[T]
func (o Option[T]) And(other Option[T]) Option[T]
func (o Option[T]) Or(other Option[T]) Option[T]
func (o Option[T]) Xor(other Option[T]) Option[T]
func (o Option[T]) IsSomeAnd(predicate func(T) bool) bool
func (o Option[T]) IsNoneOr(predicate func(T) bool) bool
func (o Option[T]) Expect(msg string) T
func (o *Option[T]) Take() Option[T]
func (o *Option[T]) TakeIf(predicate func(T) bool) Option[T]
func (o *Option[T]) Replace(value T) Option[T]
func (o *Option[T]) Insert(value T)
func (o *Option[T]) GetOrInsert(value T) T
func (o *Option[T]) GetOrInsertWith(supplier func() T)
func (o *Option[T]) GetOrInsertDefault() T
func (o Option[T]) Map(mapper func(T) T) Option[T]
func (o Option[T]) MapToAny(mapper func(T) any) Option[any]
func (o Option[T]) MapToString(mapper func(T) string) Option[string]
func (o Option[T]) MapToInt(mapper func(T) int) Option[int]
func (o Option[T]) MapToBool(mapper func(T) bool) Option[bool]
func (o Option[T]) MapOr(def T, mapper func(T) T) T
func (o Option[T]) MapOrAny(def any, mapper func(T) any) any
func (o Option[T]) MapOrString(def string, mapper func(T) string) string
func (o Option[T]) MapOrInt(def int, mapper func(T) int) int
func (o Option[T]) MapOrBool(def bool, mapper func(T) bool) bool
func (o Option[T]) MapOrElse(supplier func() T, mapper func(T) T) T
func (o Option[T]) MapOrElseAny(supplier func() any, mapper func(T) any) any
func (o Option[T]) MapOrElseString(supplier func() string, mapper func(T) string) string
func (o Option[T]) MapOrElseInt(supplier func() int, mapper func(T) int) int
func (o Option[T]) MapOrElseBool(supplier func() bool, mapper func(T) bool) bool
func (o Option[T]) MapOrDefault(mapper func(T) T) T
func (o Option[T]) OkAndResult(apply func(T) (T, error)) Option[T]
func FromResult[T any](value T, err error) Option[T]
func (o Option[T]) MarshalJSON() ([]byte, error)
func (o *Option[T]) UnmarshalJSON(data []byte) error
func (o Option[T]) String() string

Donate

  • Bitcoin (QR) 1GqdJ63RDPE4eJKujHi166FAyigvHu5R7v
  • Paypal

About

Rusty Go Option library for handling nil values, some errors and marshaling

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages