mirror of
https://github.com/stashapp/stash.git
synced 2025-12-08 01:13:09 +01:00
* Bump golang.org/x/text from 0.3.7 to 0.3.8 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.3.7 to 0.3.8. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.3.7...v0.3.8) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * Update go dependencies * Update x/net --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
package graphql
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"reflect"
|
|
)
|
|
|
|
const unmarshalInputCtx key = "unmarshal_input_context"
|
|
|
|
// BuildUnmarshalerMap returns a map of unmarshal functions of the ExecutableContext
|
|
// to use with the WithUnmarshalerMap function.
|
|
func BuildUnmarshalerMap(unmarshaler ...interface{}) map[reflect.Type]reflect.Value {
|
|
maps := make(map[reflect.Type]reflect.Value)
|
|
for _, v := range unmarshaler {
|
|
ft := reflect.TypeOf(v)
|
|
if ft.Kind() == reflect.Func {
|
|
maps[ft.Out(0)] = reflect.ValueOf(v)
|
|
}
|
|
}
|
|
|
|
return maps
|
|
}
|
|
|
|
// WithUnmarshalerMap returns a new context with a map from input types to their unmarshaler functions.
|
|
func WithUnmarshalerMap(ctx context.Context, maps map[reflect.Type]reflect.Value) context.Context {
|
|
return context.WithValue(ctx, unmarshalInputCtx, maps)
|
|
}
|
|
|
|
// UnmarshalInputFromContext allows unmarshaling input object from a context.
|
|
func UnmarshalInputFromContext(ctx context.Context, raw, v interface{}) error {
|
|
m, ok := ctx.Value(unmarshalInputCtx).(map[reflect.Type]reflect.Value)
|
|
if m == nil || !ok {
|
|
return errors.New("graphql: the input context is empty")
|
|
}
|
|
|
|
rv := reflect.ValueOf(v)
|
|
if rv.Kind() != reflect.Ptr || rv.IsNil() {
|
|
return errors.New("graphql: input must be a non-nil pointer")
|
|
}
|
|
if fn, ok := m[rv.Elem().Type()]; ok {
|
|
res := fn.Call([]reflect.Value{
|
|
reflect.ValueOf(ctx),
|
|
reflect.ValueOf(raw),
|
|
})
|
|
if err := res[1].Interface(); err != nil {
|
|
return err.(error)
|
|
}
|
|
|
|
rv.Elem().Set(res[0])
|
|
return nil
|
|
}
|
|
|
|
return errors.New("graphql: no unmarshal function found")
|
|
}
|