ita is a Go(Golang) library that provides a clean API for dynamically calling structs methods.
The name ita is a swahili word for call.
I needed a clean API for calling struct methods, that will need to avoid unnecessary panics. I identified some of the the panics I was to avoid, and return errors instead.
-
Call with too few input arguments. This happens when the method arguments are more than what are provided to the method.
-
Call with too many input arguments. This happens when the method arguments are less than the values passed to the method
-
using zero Value argument. This happens when one of the arguments has zero value or Invalid.
-
call of nil function. This happens when the method is nil
So, for my use case I had no reason to panic on any of those scenarions. Instead I wanted to have an error raised so I can make other choices rather than recover from the panic( Did I say I almost fainted after a good dose of panics!)
So, Ita works with structs methods only. And its my intetion to try to give meaningful error messages rather than panicking.
But be warned, IT IS YOUR JOB TO CHECK FOR ERRORS
The latest error encountered is always available via the Error()
method of Struct
instance.
- call methods by name
- easy access to results
- support varidaic functions
- reduced unnecessary panics, returns errors instead( Please see Motivation section)
- Method chaining (Coming soon)
go get github.com/gernest/ita
package main
import (
"fmt"
"github.com/gernest/ita"
)
type Hello struct{}
func (h *Hello) Say() string {
return "hello"
}
func (h *Hello) Who(name string) string {
return name
}
func (h *Hello) Double(word string) (string, string) {
return word, word
}
func main() {
hell := ita.New(&Hello{})
// call Who
who := hell.Call("Who", "gernest")
// If you want to check errors
if who.Error()!=nil{
// do something
}
// call Say
say := hell.Call("Say")
// call double
double := hell.Call("Double", "!")
// get the returned results for calling Who
name, _ := who.GetResults().First()
// get the result returned by Say
message, _ := say.GetResults().First()
// get results returned by double
doubleResult := double.GetResults()
firstDouble, _ := doubleResult.First()
lastDouble, _ := doubleResult.Last()
fmt.Printf("%s %s %s%s", message, name, firstDouble, lastDouble)
}
You can see tests for more examples.
Start with clicking the star button to make the author and his neighbors happy. Then fork it and submit a pull request for whatever change you want to be added to this project.
Or Open an issue for any questions.
twitter : @gernesti
- Add support for assiging results to values provided by the user.
This project is released under MIT licence see LICENCE for more details.