mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-14 18:53:35 +00:00
vendor update for E2E framework
Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
This commit is contained in:
Gopkg.lockGopkg.tomlpicker_wrapper.gopreloader.gowell_known_annotations.gowell_known_annotations_windows.gowell_known_labels.go
vendor
github.com
PuerkitoBio
beorn7
docker
distribution
spdystream
emicklei
go-restful
LICENSEcompress.gocompressor_cache.gocompressor_pools.gocompressors.goconstants.gocontainer.gocors_filter.gocurly.gocurly_route.godoc.goentity_accessors.gofilter.gojson.gojsoniter.gojsr311.go
log
logger.gomime.gooptions_filter.goparameter.gopath_expression.gopath_processor.gorequest.goresponse.goroute.goroute_builder.gorouter.goservice_error.goweb_service.goweb_service_container.goevanphx
fatih
camelcase
ghodss
go-openapi
jsonpointer
jsonreference
spec
LICENSEbindata.gocache.gocontact_info.godebug.goexpander.goexternal_docs.goheader.goinfo.goitems.golicense.gonormalizer.gooperation.goparameter.gopath_item.gopaths.goref.goresponse.goresponses.goschema.goschema_loader.gosecurity_scheme.gospec.goswagger.gotag.gounused.goxml_object.go
swag
gogo
protobuf
gogoproto
protoc-gen-gogo
golang
google
gregjones
httpcache
hashicorp
hpcloud
tail
inconshreveable
mailru
easyjson
matttproud
onsi
ginkgo
LICENSE
config
ginkgo_dsl.gointernal
codelocation
containernode
failer
leafnodes
benchmarker.gointerfaces.goit_node.gomeasure_node.gorunner.gosetup_nodes.gosuite_nodes.gosynchronized_after_suite_node.gosynchronized_before_suite_node.go
remote
aggregator.goforwarding_reporter.gooutput_interceptor.gooutput_interceptor_unix.gooutput_interceptor_win.goserver.gosyscall_dup_linux_arm64.gosyscall_dup_solaris.gosyscall_dup_unix.go
spec
spec_iterator
index_computer.goparallel_spec_iterator.goserial_spec_iterator.gosharded_parallel_spec_iterator.gospec_iterator.go
specrunner
suite
testingtproxy
writer
reporters
default_reporter.gofake_reporter.gojunit_reporter.goreporter.go
stenographer
teamcity_reporter.gotypes
gomega
LICENSEmatchers.go
format
gomega_dsl.gointernal
assertion
asyncassertion
oraclematcher
testingtsupport
matchers
and.goassignable_to_type_of_matcher.goattributes_slice.gobe_a_directory.gobe_a_regular_file.gobe_an_existing_file.gobe_closed_matcher.gobe_empty_matcher.gobe_equivalent_to_matcher.gobe_false_matcher.gobe_identical_to.gobe_nil_matcher.gobe_numerically_matcher.gobe_sent_matcher.gobe_temporally_matcher.gobe_true_matcher.gobe_zero_matcher.goconsist_of.gocontain_element_matcher.gocontain_substring_matcher.goequal_matcher.gohave_cap_matcher.gohave_key_matcher.gohave_key_with_value_matcher.gohave_len_matcher.gohave_occurred_matcher.gohave_prefix_matcher.gohave_suffix_matcher.gomatch_error_matcher.gomatch_json_matcher.gomatch_regexp_matcher.gomatch_xml_matcher.gomatch_yaml_matcher.gonot.goor.gopanic_matcher.goreceive_matcher.gosemi_structured_data_support.gosucceed_matcher.gotype_support.gowith_transform.go
support
goraph
types
opencontainers
petar
peterbourgon
pmezard
go-difflib
prometheus
client_golang
client_model
common
procfs
spf13
cobra
stretchr
golang.org
x
crypto
curve25519
const_amd64.hconst_amd64.scswap_amd64.scurve25519.godoc.gofreeze_amd64.sladderstep_amd64.smont25519_amd64.gomul_amd64.ssquare_amd64.s
ed25519
internal
chacha20
asm_arm64.sasm_ppc64le.schacha_arm64.gochacha_generic.gochacha_noasm.gochacha_ppc64le.gochacha_s390x.gochacha_s390x.sxor.go
subtle
pbkdf2
poly1305
mac_noasm.gopoly1305.gosum_amd64.gosum_amd64.ssum_arm.gosum_arm.ssum_generic.gosum_noasm.gosum_s390x.gosum_s390x.ssum_vmsl_s390x.s
ssh
net
html
http2
idna
websocket
oauth2
sys
cpu
asm_aix_ppc64.sbyteorder.gocpu.gocpu_aix_ppc64.gocpu_arm.gocpu_gc_s390x.gocpu_gc_x86.gocpu_gccgo.ccpu_gccgo.gocpu_gccgo_s390x.gocpu_linux.gocpu_linux_arm64.gocpu_linux_ppc64x.gocpu_linux_s390x.gocpu_mips64x.gocpu_mipsx.gocpu_other_arm64.gocpu_s390x.scpu_wasm.gocpu_x86.gocpu_x86.ssyscall_aix_ppc64_gc.go
unix
asm_linux_riscv64.sasm_openbsd_arm64.smkpost.gomksyscall.gomksyscall_aix_ppc.gomksyscall_aix_ppc64.gomksysctl_openbsd.gopledge_openbsd.gosockcmsg_unix.gosyscall.gosyscall_aix.gosyscall_aix_ppc.gosyscall_aix_ppc64.gosyscall_freebsd.gosyscall_linux.gosyscall_linux_arm.gosyscall_openbsd_arm64.gosyscall_unix.gotypes_aix.gounveil_openbsd.gozerrors_aix_ppc.gozerrors_aix_ppc64.gozerrors_linux_386.gozerrors_linux_amd64.gozerrors_linux_arm.gozerrors_linux_arm64.gozerrors_linux_mips.gozerrors_linux_mips64.gozerrors_linux_mips64le.gozerrors_linux_mipsle.gozerrors_linux_ppc64.gozerrors_linux_ppc64le.gozerrors_linux_riscv64.gozerrors_linux_s390x.gozerrors_linux_sparc64.gozerrors_openbsd_arm64.gozsyscall_aix_ppc.gozsyscall_aix_ppc64.gozsyscall_aix_ppc64_gc.gozsyscall_aix_ppc64_gccgo.gozsyscall_linux_386.gozsyscall_linux_amd64.gozsyscall_linux_arm.gozsyscall_linux_arm64.gozsyscall_linux_mips.gozsyscall_linux_mips64.gozsyscall_linux_mips64le.gozsyscall_linux_mipsle.gozsyscall_linux_ppc64.gozsyscall_linux_ppc64le.gozsyscall_linux_riscv64.gozsyscall_linux_s390x.gozsyscall_linux_sparc64.gozsyscall_openbsd_arm64.gozsysctl_openbsd_386.gozsysctl_openbsd_amd64.gozsysctl_openbsd_arm.gozsysctl_openbsd_arm64.gozsysnum_linux_386.gozsysnum_linux_amd64.gozsysnum_linux_arm.gozsysnum_linux_arm64.gozsysnum_linux_mips.gozsysnum_linux_mips64.gozsysnum_linux_mips64le.gozsysnum_linux_mipsle.gozsysnum_linux_ppc64.gozsysnum_linux_ppc64le.gozsysnum_linux_riscv64.gozsysnum_linux_s390x.gozsysnum_linux_sparc64.gozsysnum_openbsd_arm64.goztypes_aix_ppc.goztypes_aix_ppc64.goztypes_darwin_386.goztypes_darwin_amd64.goztypes_darwin_arm.goztypes_darwin_arm64.goztypes_dragonfly_amd64.goztypes_freebsd_386.goztypes_freebsd_amd64.goztypes_freebsd_arm.goztypes_freebsd_arm64.goztypes_linux_386.goztypes_linux_amd64.goztypes_linux_arm.goztypes_linux_arm64.goztypes_linux_mips.goztypes_linux_mips64.goztypes_linux_mips64le.goztypes_linux_mipsle.goztypes_linux_ppc64.goztypes_linux_ppc64le.goztypes_linux_riscv64.goztypes_linux_s390x.goztypes_linux_sparc64.goztypes_netbsd_386.goztypes_netbsd_amd64.goztypes_netbsd_arm.goztypes_netbsd_arm64.goztypes_openbsd_arm64.go
windows
text
collate
encoding
internal
colltab
gen
language
common.gocompact.go
compact
compose.gocoverage.gogen.gogen_common.golanguage.golookup.gomatch.goparse.gotables.gotags.gotriegen
ucd
utf8internal
language
runes
transform
unicode
bidi
cldr
norm
composition.goforminfo.goiter.gomaketables.gonormalize.goreadwriter.gotables10.0.0.gotables11.0.0.gotables9.0.0.gotransform.go
rangetable
width
google.golang.org
genproto
googleapis
rpc
status
grpc
balancer
balancer_conn_wrappers.gobalancer_v1_wrapper.goclientconn.gocodes
credentials
dialoptions.goencoding
grpclog
internal
balancerload
channelz
envconfig
syscall
transport
resolver
resolver_conn_wrapper.gorpc_util.goserver.goservice_config.gostats
stream.gotrace.goversion.gogopkg.in
fsnotify.v1
AUTHORSLICENSEfen.gofsnotify.goinotify.goinotify_poller.gokqueue.goopen_mode_bsd.goopen_mode_darwin.gowindows.go
square
go-jose.v2
tomb.v1
k8s.io
api
admission
v1beta1
imagepolicy
apiextensions-apiserver
apimachinery
pkg
api
apis
meta
internalversion
v1
util
cache
diff
duration
httpstream
mergepatch
rand
remotecommand
strategicpatch
uuid
version
third_party
apiserver
LICENSE
pkg
apis
audit
doc.gohelpers.goregister.gotypes.go
v1
doc.gogenerated.pb.goregister.gotypes.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
v1alpha1
conversion.godoc.gogenerated.pb.goregister.gotypes.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
v1beta1
conversion.godoc.gogenerated.pb.goregister.gotypes.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
zz_generated.deepcopy.goaudit
authentication
authorization
authorizer
features
storage
util
feature
cli-runtime
LICENSE
pkg
genericclioptions
builder_flags.gobuilder_flags_fake.goconfig_flags.goconfig_flags_fake.godoc.gofilename_flags.goio_options.gojson_yaml_flags.gojsonpath_flags.gokube_template_flags.goname_flags.goprint_flags.gorecord_flags.gotemplate_flags.go
kustomize
printers
resource
client-go
discovery
cached
dynamic
informers
admissionregistration
apps
auditregistration
autoscaling
batch
certificates
coordination
core
events
extensions
factory.gogeneric.gointernalinterfaces
networking
node
policy
rbac
scheduling
settings
storage
listers
admissionregistration
apps
v1
controllerrevision.godaemonset.godaemonset_expansion.godeployment.godeployment_expansion.goexpansion_generated.goreplicaset.goreplicaset_expansion.gostatefulset.gostatefulset_expansion.go
v1beta1
v1beta2
auditregistration
autoscaling
v1
v2beta1
v2beta2
batch
v1
v1beta1
v2alpha1
certificates
coordination
core
v1
componentstatus.goconfigmap.goendpoints.goevent.goexpansion_generated.golimitrange.gonamespace.gonode.gonode_expansion.gopersistentvolume.gopersistentvolumeclaim.gopod.gopodtemplate.goreplicationcontroller.goreplicationcontroller_expansion.goresourcequota.gosecret.goservice.goservice_expansion.goserviceaccount.go
events
extensions
v1beta1
networking
node
policy
v1beta1
rbac
v1
v1alpha1
v1beta1
scheduling
v1
v1alpha1
v1beta1
settings
storage
restmapper
scale
client.godoc.gointerfaces.goutil.go
scheme
appsint
appsv1beta1
appsv1beta2
autoscalingv1
doc.goextensionsint
extensionsv1beta1
register.gotypes.gozz_generated.deepcopy.gothird_party
tools
cache
controller.godelta_fifo.godoc.goexpiration_cache.goexpiration_cache_fakes.gofake_custom_store.gofifo.goheap.goindex.golisters.golistwatch.gomutation_cache.gomutation_detector.goreflector.goreflector_metrics.goshared_informer.gostore.gothread_safe_store.goundelta_store.go
pager
record
remotecommand
watch
transport
spdy
util
cloud-provider
cluster-bootstrap
component-base
csi-translation-lib
klog
kube-aggregator
kube-openapi
kubernetes
cmd
kubeadm
pkg
api
apis
admissionregistration
apps
auditregistration
authentication
authorization
autoscaling
batch
certificates
coordination
core
annotation_key_constants.godoc.gofield_constants.go
helper
install
json.goobjectreference.gopods
register.goresource.gotaint.gotoleration.gotypes.gov1
validation
zz_generated.deepcopy.goevents
extensions
networking
node
policy
rbac
doc.gohelpers.go
install
register.gotypes.gov1
defaults.godoc.goevaluation_helpers.gohelpers.goregister.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
v1alpha1
conversion.godefaults.godoc.gohelpers.goregister.gozz_generated.conversion.gozz_generated.defaults.go
v1beta1
zz_generated.deepcopy.goscheduling
settings
storage
capabilities
client
clientset_generated
internalclientset
clientset.godoc.go
scheme
typed
admissionregistration
internalversion
apps
internalversion
auditregistration
authentication
internalversion
authorization
internalversion
autoscaling
batch
internalversion
certificates
internalversion
coordination
internalversion
core
internalversion
componentstatus.goconfigmap.gocore_client.godoc.goendpoints.goevent.goevent_expansion.gogenerated_expansion.golimitrange.gonamespace.gonamespace_expansion.gonode.gonode_expansion.gopersistentvolume.gopersistentvolumeclaim.gopod.gopod_expansion.gopodtemplate.goreplicationcontroller.goresourcequota.gosecret.goservice.goservice_expansion.goserviceaccount.go
events
internalversion
extensions
internalversion
networking
node
internalversion
policy
internalversion
rbac
internalversion
scheduling
settings
internalversion
storage
conditions
controller
client_builder.gocontroller_ref_manager.gocontroller_utils.go
deployment
doc.gojob
lookup_cache.gonodelifecycle
service
util
volume
features
fieldpath
kubectl
apply.go
apps
conditions.godescribe
doc.gohistory.gointerfaces.gorollback.gorolling_updater.gorollout_status.goscale.goscheme
util
certificate
deployment
event
fieldpath
pod_port.gopodutils
qos
rbac
resource
service_port.goslice
storage
umask.goumask_windows.goutil.gokubelet
apis
config
cri
runtime
v1alpha2
stats
v1alpha1
container
cache.gocontainer_gc.gocontainer_reference_manager.gohelpers.goos.goref.goresize.goruntime.goruntime_cache.goruntime_cache_fake.gosync_result.go
dockershim
metrics
events
lifecycle
metrics
sysctl
types
util
format
master
proxy
registry
core
service
scheduler
security
apparmor
podsecuritypolicy
serviceaccount
ssh
util
goroutinemap
hash
labels
metrics
node
parsers
resizefs
system
taints
version
volume
doc.gometrics_cached.gometrics_du.gometrics_errors.gometrics_nil.gometrics_statfs.gonoop_expandable_plugin.goplugins.go
util
atomic_writer.goattach_limit.godevice_util.godevice_util_linux.godevice_util_unsupported.godoc.gofinalizer.go
volume.govolume_linux.govolume_unsupported.gofs
io_util.gometrics.gonested_volumes.gorecyclerclient
resize_util.gosubpath
types
util.govolumepathhandler
test
e2e
framework
authorizer_util.gocleanup.gocreate.godeployment_util.goexec_util.goflake_reporting_util.goframework.goget-kubemark-resource-usage.go
ginkgowrapper
google_compute.gogpu_util.gojobs_util.gokubelet_stats.golog_size_monitoring.gometrics
api_server_metrics.gocluster_autoscaler_metrics.gocontroller_manager_metrics.gogeneric_metrics.gokubelet_metrics.gometrics_grabber.goscheduler_metrics.go
metrics_util.gonetworking_utils.gonodes_util.goperf_util.gopods.goprofile_gatherer.goprovider.gopsp_util.gopv_util.gorc_util.goresource_usage_gatherer.gors_util.goservice_util.gosize.gossh.gostatefulset_utils.gotest_context.gotestfiles
upgrade_util.goutil.govolume_util.gomanifest
perftype
utils
third_party
forked
golang
expansion
utils
buffer
io
net
pointer
strings
trace
sigs.k8s.io
kustomize
LICENSEimage.golabelsandannotations.gomultitransformer.gomutatefield.gonamereference.gonamespace.gonooptransformer.goprefixsuffixname.gorefvars.gotransformer.go
pkg
commands
build
constants
expansion
factory
fs
git
gvk
ifc
image
internal
error
loader
patch
resid
resmap
resource
target
transformers
config
defaultconfig
commonannotations.gocommonlabels.godefaultconfig.gonameprefix.gonamereference.gonamespace.govarreference.go
factory.gofactorycrd.gofieldspec.gonamebackreferences.gotransformerconfig.gotypes
390
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
390
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
@ -0,0 +1,390 @@
|
||||
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// author sigu-399
|
||||
// author-github https://github.com/sigu-399
|
||||
// author-mail sigu.399@gmail.com
|
||||
//
|
||||
// repository-name jsonpointer
|
||||
// repository-desc An implementation of JSON Pointer - Go language
|
||||
//
|
||||
// description Main and unique file.
|
||||
//
|
||||
// created 25-02-2013
|
||||
|
||||
package jsonpointer
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/go-openapi/swag"
|
||||
)
|
||||
|
||||
const (
|
||||
emptyPointer = ``
|
||||
pointerSeparator = `/`
|
||||
|
||||
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
|
||||
)
|
||||
|
||||
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
|
||||
var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
|
||||
|
||||
// JSONPointable is an interface for structs to implement when they need to customize the
|
||||
// json pointer process
|
||||
type JSONPointable interface {
|
||||
JSONLookup(string) (interface{}, error)
|
||||
}
|
||||
|
||||
// JSONSetable is an interface for structs to implement when they need to customize the
|
||||
// json pointer process
|
||||
type JSONSetable interface {
|
||||
JSONSet(string, interface{}) error
|
||||
}
|
||||
|
||||
// New creates a new json pointer for the given string
|
||||
func New(jsonPointerString string) (Pointer, error) {
|
||||
|
||||
var p Pointer
|
||||
err := p.parse(jsonPointerString)
|
||||
return p, err
|
||||
|
||||
}
|
||||
|
||||
// Pointer the json pointer reprsentation
|
||||
type Pointer struct {
|
||||
referenceTokens []string
|
||||
}
|
||||
|
||||
// "Constructor", parses the given string JSON pointer
|
||||
func (p *Pointer) parse(jsonPointerString string) error {
|
||||
|
||||
var err error
|
||||
|
||||
if jsonPointerString != emptyPointer {
|
||||
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
|
||||
err = errors.New(invalidStart)
|
||||
} else {
|
||||
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
|
||||
for _, referenceToken := range referenceTokens[1:] {
|
||||
p.referenceTokens = append(p.referenceTokens, referenceToken)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Get uses the pointer to retrieve a value from a JSON document
|
||||
func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) {
|
||||
return p.get(document, swag.DefaultJSONNameProvider)
|
||||
}
|
||||
|
||||
// Set uses the pointer to set a value from a JSON document
|
||||
func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) {
|
||||
return document, p.set(document, value, swag.DefaultJSONNameProvider)
|
||||
}
|
||||
|
||||
// GetForToken gets a value for a json pointer token 1 level deep
|
||||
func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) {
|
||||
return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider)
|
||||
}
|
||||
|
||||
// SetForToken gets a value for a json pointer token 1 level deep
|
||||
func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) {
|
||||
return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider)
|
||||
}
|
||||
|
||||
func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||
kind := rValue.Kind()
|
||||
|
||||
switch kind {
|
||||
|
||||
case reflect.Struct:
|
||||
if rValue.Type().Implements(jsonPointableType) {
|
||||
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||
if err != nil {
|
||||
return nil, kind, err
|
||||
}
|
||||
return r, kind, nil
|
||||
}
|
||||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||
if !ok {
|
||||
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
|
||||
}
|
||||
fld := rValue.FieldByName(nm)
|
||||
return fld.Interface(), kind, nil
|
||||
|
||||
case reflect.Map:
|
||||
kv := reflect.ValueOf(decodedToken)
|
||||
mv := rValue.MapIndex(kv)
|
||||
|
||||
if mv.IsValid() && !swag.IsZero(mv) {
|
||||
return mv.Interface(), kind, nil
|
||||
}
|
||||
return nil, kind, fmt.Errorf("object has no key %q", decodedToken)
|
||||
|
||||
case reflect.Slice:
|
||||
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||
if err != nil {
|
||||
return nil, kind, err
|
||||
}
|
||||
sLength := rValue.Len()
|
||||
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex)
|
||||
}
|
||||
|
||||
elem := rValue.Index(tokenIndex)
|
||||
return elem.Interface(), kind, nil
|
||||
|
||||
default:
|
||||
return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error {
|
||||
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||
switch rValue.Kind() {
|
||||
|
||||
case reflect.Struct:
|
||||
if ns, ok := node.(JSONSetable); ok { // pointer impl
|
||||
return ns.JSONSet(decodedToken, data)
|
||||
}
|
||||
|
||||
if rValue.Type().Implements(jsonSetableType) {
|
||||
return node.(JSONSetable).JSONSet(decodedToken, data)
|
||||
}
|
||||
|
||||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||
if !ok {
|
||||
return fmt.Errorf("object has no field %q", decodedToken)
|
||||
}
|
||||
fld := rValue.FieldByName(nm)
|
||||
if fld.IsValid() {
|
||||
fld.Set(reflect.ValueOf(data))
|
||||
}
|
||||
return nil
|
||||
|
||||
case reflect.Map:
|
||||
kv := reflect.ValueOf(decodedToken)
|
||||
rValue.SetMapIndex(kv, reflect.ValueOf(data))
|
||||
return nil
|
||||
|
||||
case reflect.Slice:
|
||||
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sLength := rValue.Len()
|
||||
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||
}
|
||||
|
||||
elem := rValue.Index(tokenIndex)
|
||||
if !elem.CanSet() {
|
||||
return fmt.Errorf("can't set slice index %s to %v", decodedToken, data)
|
||||
}
|
||||
elem.Set(reflect.ValueOf(data))
|
||||
return nil
|
||||
|
||||
default:
|
||||
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||
|
||||
if nameProvider == nil {
|
||||
nameProvider = swag.DefaultJSONNameProvider
|
||||
}
|
||||
|
||||
kind := reflect.Invalid
|
||||
|
||||
// Full document when empty
|
||||
if len(p.referenceTokens) == 0 {
|
||||
return node, kind, nil
|
||||
}
|
||||
|
||||
for _, token := range p.referenceTokens {
|
||||
|
||||
decodedToken := Unescape(token)
|
||||
|
||||
r, knd, err := getSingleImpl(node, decodedToken, nameProvider)
|
||||
if err != nil {
|
||||
return nil, knd, err
|
||||
}
|
||||
node, kind = r, knd
|
||||
|
||||
}
|
||||
|
||||
rValue := reflect.ValueOf(node)
|
||||
kind = rValue.Kind()
|
||||
|
||||
return node, kind, nil
|
||||
}
|
||||
|
||||
func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error {
|
||||
knd := reflect.ValueOf(node).Kind()
|
||||
|
||||
if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
|
||||
return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values")
|
||||
}
|
||||
|
||||
if nameProvider == nil {
|
||||
nameProvider = swag.DefaultJSONNameProvider
|
||||
}
|
||||
|
||||
// Full document when empty
|
||||
if len(p.referenceTokens) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
lastI := len(p.referenceTokens) - 1
|
||||
for i, token := range p.referenceTokens {
|
||||
isLastToken := i == lastI
|
||||
decodedToken := Unescape(token)
|
||||
|
||||
if isLastToken {
|
||||
|
||||
return setSingleImpl(node, data, decodedToken, nameProvider)
|
||||
}
|
||||
|
||||
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||
kind := rValue.Kind()
|
||||
|
||||
switch kind {
|
||||
|
||||
case reflect.Struct:
|
||||
if rValue.Type().Implements(jsonPointableType) {
|
||||
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fld := reflect.ValueOf(r)
|
||||
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||
node = fld.Addr().Interface()
|
||||
continue
|
||||
}
|
||||
node = r
|
||||
continue
|
||||
}
|
||||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||
if !ok {
|
||||
return fmt.Errorf("object has no field %q", decodedToken)
|
||||
}
|
||||
fld := rValue.FieldByName(nm)
|
||||
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||
node = fld.Addr().Interface()
|
||||
continue
|
||||
}
|
||||
node = fld.Interface()
|
||||
|
||||
case reflect.Map:
|
||||
kv := reflect.ValueOf(decodedToken)
|
||||
mv := rValue.MapIndex(kv)
|
||||
|
||||
if !mv.IsValid() {
|
||||
return fmt.Errorf("object has no key %q", decodedToken)
|
||||
}
|
||||
if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr {
|
||||
node = mv.Addr().Interface()
|
||||
continue
|
||||
}
|
||||
node = mv.Interface()
|
||||
|
||||
case reflect.Slice:
|
||||
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sLength := rValue.Len()
|
||||
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||
}
|
||||
|
||||
elem := rValue.Index(tokenIndex)
|
||||
if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr {
|
||||
node = elem.Addr().Interface()
|
||||
continue
|
||||
}
|
||||
node = elem.Interface()
|
||||
|
||||
default:
|
||||
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DecodedTokens returns the decoded tokens
|
||||
func (p *Pointer) DecodedTokens() []string {
|
||||
result := make([]string, 0, len(p.referenceTokens))
|
||||
for _, t := range p.referenceTokens {
|
||||
result = append(result, Unescape(t))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// IsEmpty returns true if this is an empty json pointer
|
||||
// this indicates that it points to the root document
|
||||
func (p *Pointer) IsEmpty() bool {
|
||||
return len(p.referenceTokens) == 0
|
||||
}
|
||||
|
||||
// Pointer to string representation function
|
||||
func (p *Pointer) String() string {
|
||||
|
||||
if len(p.referenceTokens) == 0 {
|
||||
return emptyPointer
|
||||
}
|
||||
|
||||
pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
|
||||
|
||||
return pointerString
|
||||
}
|
||||
|
||||
// Specific JSON pointer encoding here
|
||||
// ~0 => ~
|
||||
// ~1 => /
|
||||
// ... and vice versa
|
||||
|
||||
const (
|
||||
encRefTok0 = `~0`
|
||||
encRefTok1 = `~1`
|
||||
decRefTok0 = `~`
|
||||
decRefTok1 = `/`
|
||||
)
|
||||
|
||||
// Unescape unescapes a json pointer reference token string to the original representation
|
||||
func Unescape(token string) string {
|
||||
step1 := strings.Replace(token, encRefTok1, decRefTok1, -1)
|
||||
step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1)
|
||||
return step2
|
||||
}
|
||||
|
||||
// Escape escapes a pointer reference token string
|
||||
func Escape(token string) string {
|
||||
step1 := strings.Replace(token, decRefTok0, encRefTok0, -1)
|
||||
step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1)
|
||||
return step2
|
||||
}
|
Reference in New Issue
Block a user