add vendor
This commit is contained in:
vendor
cloud.google.com
go
code.gitea.io
sdk
gitea
LICENSEadmin_cron.goadmin_org.goadmin_repo.goadmin_user.goattachment.goclient.godoc.gofork.gogit_blob.gogit_hook.gohelper.gohook.goissue.goissue_comment.goissue_label.goissue_milestone.goissue_reaction.goissue_stopwatch.goissue_subscription.goissue_tracked_time.golist_options.gonotifications.gooauth2.goorg.goorg_member.goorg_team.gopull.gopull_review.gorelease.gorepo.gorepo_branch.gorepo_branch_protection.gorepo_collaborator.gorepo_commit.gorepo_file.gorepo_key.gorepo_migrate.gorepo_refs.gorepo_stars.gorepo_tag.gorepo_team.gorepo_template.gorepo_topics.gorepo_transfer.gorepo_tree.gorepo_watch.gosettings.gostatus.gouser.gouser_app.gouser_email.gouser_follow.gouser_gpgkey.gouser_key.gouser_search.gouser_settings.goversion.go
github.com
Masterminds
goutils
.travis.ymlCHANGELOG.mdLICENSE.txtREADME.mdappveyor.ymlcryptorandomstringutils.gorandomstringutils.gostringutils.gowordutils.go
semver
.travis.ymlCHANGELOG.mdLICENSE.txtMakefileREADME.mdappveyor.ymlcollection.goconstraints.godoc.goversion.goversion_fuzz.go
sprig
agext
apparentlymart
go-cidr
go-textseg
armon
aws
aws-sdk-go
LICENSE.txtNOTICE.txtjsonvalue.gopayload.go
aws
awserr
awsutil
client
config.gocontext_1_5.gocontext_1_9.gocontext_background_1_5.gocontext_background_1_7.gocontext_sleep.goconvert_types.gocorehandlers
credentials
chain_provider.gocredentials.go
ec2rolecreds
endpointcreds
env_provider.goexample.iniprocesscreds
shared_credentials_provider.gostatic_provider.gostscreds
csm
defaults
doc.goec2metadata
endpoints
errors.gojsonvalue.gologger.gorequest
connection_reset_error.gohandlers.gohttp_request.gooffset_reader.gorequest.gorequest_1_7.gorequest_1_8.gorequest_context.gorequest_context_1_6.gorequest_pagination.goretryer.gotimeout_read_closer.govalidation.gowaiter.go
session
cabundle_transport.gocabundle_transport_1_5.gocabundle_transport_1_6.gocredentials.godoc.goenv_config.gosession.goshared_config.go
signer
types.gourl.gourl_1_7.goversion.gointernal
ini
ast.gocomma_token.gocomment_token.godoc.goempty_token.goexpression.gofuzz.goini.goini_lexer.goini_parser.goliteral_tokens.gonewline_token.gonumber_helper.goop_tokens.goparse_error.goparse_stack.gosep_tokens.goskipper.gostatement.govalue_util.govisitor.gowalker.gows_token.go
s3err
sdkio
sdkmath
sdkrand
sdkuri
shareddefaults
private
protocol
eventstream
host.gohost_prefix.goidempotency.gojson
jsonutil
query
rest
restxml
timestamp.gounmarshal.goxml
service
bgentry
go-netrc
speakeasy
davecgh
fatih
golang
protobuf
google
go-cmp
LICENSE
cmp
uuid
googleapis
hashicorp
errwrap
go-checkpoint
go-cleanhttp
go-getter
.travis.ymlLICENSEREADME.mdappveyor.ymlchecksum.goclient.goclient_mode.goclient_option.goclient_option_progress.gocommon.gocopy_dir.godecompress.godecompress_bzip2.godecompress_gzip.godecompress_tar.godecompress_tbz2.godecompress_testing.godecompress_tgz.godecompress_txz.godecompress_xz.godecompress_zip.godetect.godetect_bitbucket.godetect_file.godetect_gcs.godetect_git.godetect_github.godetect_s3.godetect_ssh.gofolder_storage.goget.goget_base.goget_file.goget_file_copy.goget_file_unix.goget_file_windows.goget_gcs.goget_git.goget_hg.goget_http.goget_mock.goget_s3.go
helper
netrc.gosource.gostorage.gogo-hclog
.gitignoreLICENSEREADME.mdcontext.goglobal.gointlogger.gologger.gonulllogger.gostacktrace.gostdlog.gowriter.go
go-multierror
go-plugin
.gitignoreLICENSEREADME.mdclient.godiscover.goerror.gogrpc_broker.gogrpc_client.gogrpc_controller.gogrpc_server.go
internal
log_entry.gomtls.gomux_broker.goplugin.goprocess.goprocess_posix.goprocess_windows.goprotocol.gorpc_client.gorpc_server.goserver.goserver_mux.gostream.gotesting.gogo-safetemp
go-uuid
go-version
golang-lru
hc-install
.go-version.goreleaser.ymlLICENSEREADME.md
checkpoint
errors
fs
installer.gointernal
build
httpclient
pubkey
releasesjson
src
validators
version
product
releases
src
hcl
.gitignore.travis.ymlLICENSEMakefileREADME.mdappveyor.ymldecoder.gohcl.go
hcl
json
lex.goparse.gov2
CHANGELOG.mdLICENSEREADME.mddiagnostic.godiagnostic_text.godidyoumean.godoc.goeval_context.goexpr_call.goexpr_list.goexpr_map.goexpr_unwrap.go
ext
dynblock
README.mdexpand_body.goexpand_spec.goexpr_wrap.goiteration.gopublic.goschema.gounknown_body.govariables.govariables_hcldec.go
typeexpr
gohcl
hcldec
hcled
hclparse
hclsyntax
diagnostics.godidyoumean.godoc.goexpression.goexpression_ops.goexpression_template.goexpression_vars.gofile.gogenerate.gokeywords.gonavigation.gonode.goparser.goparser_template.goparser_traversal.gopeeker.gopublic.goscan_string_lit.goscan_string_lit.rlscan_tokens.goscan_tokens.rlspec.mdstructure.gostructure_at_pos.gotoken.gotoken_type_string.gounicode2ragel.rbunicode_derived.rlvariables.gowalk.go
hclwrite
ast.goast_attribute.goast_block.goast_body.goast_expression.godoc.goformat.gogenerate.gonative_node_sorter.gonode.goparser.gopublic.gotokens.go
json
ast.godidyoumean.godoc.gonavigation.goparser.gopeeker.gopublic.goscanner.gospec.mdstructure.gotokentype_string.go
merged.goops.gopos.gopos_scanner.goschema.gospec.mdstatic_expr.gostructure.gostructure_at_pos.gotraversal.gotraversal_for_expr.gologutils
terraform-config-inspect
LICENSE
tfconfig
terraform-exec
LICENSE
internal
version
tfexec
apply.gocmd.gocmd_default.gocmd_linux.godestroy.godoc.goerrors.goexit_errors.gofmt.goforce_unlock.goget.gograph.goimport.goinit.gooptions.gooutput.goplan.goproviders_lock.goproviders_schema.gorefresh.goshow.gostate_mv.gostate_rm.gotaint.goterraform.gountaint.goupgrade012.goupgrade013.govalidate.goversion.goworkspace_delete.goworkspace_list.goworkspace_new.goworkspace_select.goworkspace_show.go
terraform-json
.gitignore.go-versionLICENSEMakefileREADME.mdaction.goconfig.goexpression.goplan.goschemas.gostate.gotfjson.govalidate.goversion.go
terraform-plugin-docs
terraform-plugin-sdk
LICENSE
acctest
helper
hashcode
logging
resource
error.gogrpc_test_provider.goid.gomap.goresource.gostate.gostate_shim.gotesting.gotesting_config.gotesting_import_state.gotesting_new.gotesting_new_config.gotesting_new_import_state.gowait.go
schema
README.mdbackend.gocore_schema.godata_source_resource_shim.goequal.gofield_reader.gofield_reader_config.gofield_reader_diff.gofield_reader_map.gofield_reader_multi.gofield_writer.gofield_writer_map.gogetsource_string.goprovider.goresource.goresource_data.goresource_data_get_source.goresource_diff.goresource_importer.goresource_timeout.goschema.goserialize.goset.goshims.gotesting.govaluetype.govaluetype_string.go
httpclient
internal
addrs
count_attr.godoc.gofor_each_attr.goinput_variable.goinstance_key.golocal_value.gomodule.gomodule_call.gomodule_instance.gooutput_value.goparse_ref.goparse_target.gopath_attr.goprovider_config.goprovider_type.goreferenceable.goresource.goresource_phase.goresourcemode_string.goself.gotargetable.goterraform_attr.go
command
configs
backend.gocompat_shim.goconfig.goconfig_build.go
configload
copy_dir.godoc.goinode.goinode_freebsd.goinode_windows.goloader.goloader_load.goloader_snapshot.gomodule_mgr.gotesting.go
configschema
coerce_value.godecoder_spec.godoc.goempty_value.goimplied_type.gointernal_validate.gonestingmode_string.gonone_required.goschema.govalidate_traversal.go
depends_on.godoc.gohcl2shim
module.gomodule_call.gomodule_merge.gomodule_merge_body.gonamed_values.goparser.goparser_config.goparser_config_dir.goparser_values.goprovider.goprovisioner.goprovisioneronfailure_string.goprovisionerwhen_string.goresource.gosynth_body.goutil.govariable_type_hint.govariabletypehint_string.goversion_constraint.godag
earlyconfig
flatmap
helper
httpclient
initwd
copy_dir.godoc.gofrom_module.gogetter.goinode.goinode_freebsd.goinode_windows.gomodule_install.gomodule_install_hooks.go
lang
modsdir
moduledeps
plans
action.goaction_string.gochanges.gochanges_src.gochanges_sync.godoc.godynamic_value.go
objchange
plan.goplugin
convert
discovery
providers
provisioners
registry
states
doc.goeachmode_string.goinstance_generation.goinstance_object.goinstance_object_src.gomodule.goobjectstatus_string.gooutput_value.goresource.gostate.gostate_deepcopy.gostate_equal.gostate_string.go
statefile
diagnostics.godoc.gofile.goread.goversion0.goversion1.goversion1_upgrade.goversion2.goversion2_upgrade.goversion3.goversion3_upgrade.goversion4.gowrite.go
sync.gotfdiags
config_traversals.gocontextual.godiagnostic.godiagnostic_base.godiagnostics.godoc.goerror.gohcl.gorpc_friendly.goseverity_string.gosimple_warning.gosource_range.gosourceless.go
tfplugin5
version
meta
plugin
client.gogrpc_provider.gogrpc_provisioner.goplugin.goresource_provider.goserve.goui_input.goui_output.go
terraform
context.gocontext_components.gocontext_graph_type.gocontext_import.gocontext_input.godiff.goedge_destroy.goeval.goeval_apply.goeval_check_prevent_destroy.goeval_context.goeval_context_builtin.goeval_context_mock.goeval_count.goeval_count_boundary.goeval_diff.goeval_error.goeval_filter.goeval_filter_operation.goeval_for_each.goeval_if.goeval_import_state.goeval_lang.goeval_local.goeval_noop.goeval_output.goeval_provider.goeval_provisioner.goeval_read_data.goeval_refresh.goeval_sequence.goeval_state.goeval_state_upgrade.goeval_validate.goeval_validate_selfref.goeval_variable.goevaltree_provider.goevaluate.goevaluate_valid.gofeatures.gograph.gograph_builder.gograph_builder_apply.gograph_builder_destroy_plan.gograph_builder_eval.gograph_builder_import.gograph_builder_plan.gograph_builder_refresh.gograph_builder_validate.gograph_dot.gograph_interface_subgraph.gograph_walk.gograph_walk_context.gograph_walk_operation.gographtype_string.gohook.gohook_mock.gohook_stop.goinstancetype.goinstancetype_string.gomodule_dependencies.gonode_count_boundary.gonode_data_destroy.gonode_data_refresh.gonode_local.gonode_module_removed.gonode_module_variable.gonode_output.gonode_output_orphan.gonode_provider.gonode_provider_abstract.gonode_provider_disabled.gonode_provider_eval.gonode_provisioner.gonode_resource_abstract.gonode_resource_apply.gonode_resource_apply_instance.gonode_resource_destroy.gonode_resource_destroy_deposed.gonode_resource_plan.gonode_resource_plan_destroy.gonode_resource_plan_instance.gonode_resource_plan_orphan.gonode_resource_refresh.gonode_resource_validate.gonode_root_variable.gopath.goplan.goprovider_mock.goprovisioner_mock.goresource.goresource_address.goresource_mode.goresource_mode_string.goresource_provider.goresource_provider_mock.goresource_provisioner.goresource_provisioner_mock.goschemas.gostate.gostate_filter.gostate_upgrade_v1_to_v2.gostate_upgrade_v2_to_v3.gostate_v1.gotesting.gotransform.gotransform_attach_config_provider.gotransform_attach_config_resource.gotransform_attach_schema.gotransform_attach_state.gotransform_config.gotransform_count_boundary.gotransform_destroy_cbd.gotransform_destroy_edge.gotransform_diff.gotransform_expand.gotransform_import_provider.gotransform_import_state.gotransform_local.gotransform_module_variable.gotransform_orphan_count.gotransform_orphan_output.gotransform_orphan_resource.gotransform_output.gotransform_provider.gotransform_provisioner.gotransform_reference.gotransform_removed_modules.gotransform_resource_count.gotransform_root.gotransform_state.gotransform_targets.gotransform_transitive_reduction.gotransform_variable.gotransform_vertex.goui_input.goui_input_mock.goui_input_prefix.goui_output.goui_output_callback.goui_output_mock.goui_output_provisioner.goutil.govaluesourcetype_string.govariables.goversion_required.gowalkoperation_string.go
terraform-plugin-test
terraform-svchost
yamux
huandu
xstrings
imdario
mergo
jmespath
go-jmespath
mattn
go-colorable
LICENSEREADME.mdcolorable_appengine.gocolorable_others.gocolorable_windows.gogo.test.shnoncolorable.go
go-isatty
mitchellh
cli
.travis.ymlLICENSEMakefileREADME.mdautocomplete.gocli.gocommand.gocommand_mock.gohelp.goui.goui_colored.goui_concurrent.goui_mock.goui_writer.go
colorstring
copystructure
go-homedir
go-testing-interface
go-wordwrap
mapstructure
reflectwalk
oklog
posener
complete
russross
blackfriday
spf13
afero
ulikunitz
xz
.gitignoreLICENSEREADME.mdTODO.mdbits.gocrc.goformat.gofox.xz
internal
lzma
bintree.gobitops.gobreader.gobuffer.gobytewriter.godecoder.godecoderdict.godirectcodec.godistcodec.goencoder.goencoderdict.gofox.lzmahashtable.goheader.goheader2.golengthcodec.goliteralcodec.gomatchalgorithm.gooperation.goprob.goproperties.gorangecodec.goreader.goreader2.gostate.gotreecodecs.gowriter.gowriter2.go
lzmafilter.gomake-docsreader.gowriter.govmihailenco
msgpack
v4
.golangci.yml.travis.ymlCHANGELOG.mdLICENSEMakefileREADME.mdappengine.go
codes
decode.godecode_map.godecode_number.godecode_query.godecode_slice.godecode_string.godecode_value.goencode.goencode_map.goencode_number.goencode_slice.goencode_value.goext.gointern.gomsgpack.gosafe.gotime.gotypes.gounsafe.gotagparser
zclconf
go-cty-yaml
.travis.ymlCHANGELOG.mdLICENSELICENSE.libyamlNOTICEapic.goconverter.gocty_funcs.godecode.goemitterc.goencode.goerror.goimplied_type.goparserc.goreaderc.goresolve.goscannerc.gowriterc.goyaml.goyamlh.goyamlprivateh.go
go-cty
LICENSE
cty
capsule.gocapsule_ops.gocollection.go
convert
compare_types.goconversion.goconversion_capsule.goconversion_collection.goconversion_dynamic.goconversion_object.goconversion_primitive.goconversion_tuple.godoc.gomismatch_msg.gopublic.gosort_types.gounify.go
doc.goelement_iterator.goerror.gofunction
argument.godoc.goerror.gofunction.go
gob.gostdlib
bool.gobytes.gocollection.goconversion.gocsv.godatetime.godoc.goformat.goformat_fsm.goformat_fsm.rlgeneral.gojson.gonumber.goregexp.gosequence.goset.gostring.gostring_replace.go
unpredictable.gogocty
helper.gojson.gojson
list_type.gomap_type.gomarks.gomsgpack
null.goobject_type.gopath.gopath_set.goprimitive_type.goset
set_helper.goset_internals.goset_type.gotuple_type.gotype.gotype_conform.gotypes_to_register.gounknown.gounknown_as_null.govalue.govalue_init.govalue_ops.gowalk.gogo.opencensus.io
.gitignore.travis.ymlAUTHORSCONTRIBUTING.mdGopkg.lockGopkg.tomlLICENSEMakefileREADME.mdappveyor.ymlopencensus.go
internal
metric
metricdata
metricproducer
plugin
ochttp
resource
stats
tag
trace
golang.org
x
crypto
AUTHORSCONTRIBUTORSLICENSEPATENTS
bcrypt
blowfish
cast5
openpgp
armor
canonical_text.goelgamal
errors
keys.gopacket
compressed.goconfig.goencrypted_key.goliteral.goocfb.goone_pass_signature.goopaque.gopacket.goprivate_key.gopublic_key.gopublic_key_v3.goreader.gosignature.gosignature_v3.gosymmetric_key_encrypted.gosymmetrically_encrypted.gouserattribute.gouserid.go
read.gos2k
write.gopbkdf2
scrypt
net
AUTHORSCONTRIBUTORSLICENSEPATENTS
context
http
httpguts
http2
.gitignoreDockerfileMakefileREADMEciphers.goclient_conn_pool.godatabuffer.goerrors.goflow.goframe.gogo111.gogotrack.goheadermap.go
hpack
http2.gonot_go111.gopipe.goserver.gotransport.gowrite.gowritesched.gowritesched_priority.gowritesched_random.goidna
idna10.0.0.goidna9.0.0.gopunycode.gotables10.0.0.gotables11.0.0.gotables12.0.0.gotables13.0.0.gotables9.0.0.gotrie.gotrieval.go
internal
timeseries
trace
oauth2
.travis.ymlAUTHORSCONTRIBUTING.mdCONTRIBUTORSLICENSEREADME.md
google
internal
jws
jwt
oauth2.gotoken.gotransport.gosys
AUTHORSCONTRIBUTORSLICENSEPATENTS
internal
unsafeheader
unix
.gitignoreREADME.mdaffinity_linux.goaliases.goasm_aix_ppc64.sasm_bsd_386.sasm_bsd_amd64.sasm_bsd_arm.sasm_bsd_arm64.sasm_linux_386.sasm_linux_amd64.sasm_linux_arm.sasm_linux_arm64.sasm_linux_mips64x.sasm_linux_mipsx.sasm_linux_ppc64x.sasm_linux_riscv64.sasm_linux_s390x.sasm_openbsd_mips64.sasm_solaris_amd64.sasm_zos_s390x.sbluetooth_linux.gocap_freebsd.goconstants.godev_aix_ppc.godev_aix_ppc64.godev_darwin.godev_dragonfly.godev_freebsd.godev_linux.godev_netbsd.godev_openbsd.godev_zos.godirent.goendian_big.goendian_little.goenv_unix.goepoll_zos.goerrors_freebsd_386.goerrors_freebsd_amd64.goerrors_freebsd_arm.goerrors_freebsd_arm64.gofcntl.gofcntl_darwin.gofcntl_linux_32bit.gofdset.gofstatfs_zos.gogccgo.gogccgo_c.cgccgo_linux_amd64.goifreq_linux.goioctl.goioctl_linux.goioctl_zos.gomkall.shmkerrors.shpagesize_unix.gopledge_openbsd.goptrace_darwin.goptrace_ios.gorace.gorace0.goreaddirent_getdents.goreaddirent_getdirentries.gosockcmsg_dragonfly.gosockcmsg_linux.gosockcmsg_unix.gosockcmsg_unix_other.gostr.gosyscall.gosyscall_aix.gosyscall_aix_ppc.gosyscall_aix_ppc64.gosyscall_bsd.gosyscall_darwin.1_12.gosyscall_darwin.1_13.gosyscall_darwin.gosyscall_darwin_amd64.gosyscall_darwin_arm64.gosyscall_darwin_libSystem.gosyscall_dragonfly.gosyscall_dragonfly_amd64.gosyscall_freebsd.gosyscall_freebsd_386.gosyscall_freebsd_amd64.gosyscall_freebsd_arm.gosyscall_freebsd_arm64.gosyscall_illumos.gosyscall_linux.gosyscall_linux_386.gosyscall_linux_amd64.gosyscall_linux_amd64_gc.gosyscall_linux_arm.gosyscall_linux_arm64.gosyscall_linux_gc.gosyscall_linux_gc_386.gosyscall_linux_gc_arm.gosyscall_linux_gccgo_386.gosyscall_linux_gccgo_arm.gosyscall_linux_mips64x.gosyscall_linux_mipsx.gosyscall_linux_ppc.gosyscall_linux_ppc64x.gosyscall_linux_riscv64.gosyscall_linux_s390x.gosyscall_linux_sparc64.gosyscall_netbsd.gosyscall_netbsd_386.gosyscall_netbsd_amd64.gosyscall_netbsd_arm.gosyscall_netbsd_arm64.gosyscall_openbsd.gosyscall_openbsd_386.gosyscall_openbsd_amd64.gosyscall_openbsd_arm.gosyscall_openbsd_arm64.gosyscall_openbsd_mips64.gosyscall_solaris.gosyscall_solaris_amd64.gosyscall_unix.gosyscall_unix_gc.gosyscall_unix_gc_ppc64x.gosyscall_zos_s390x.gotimestruct.gounveil_openbsd.goxattr_bsd.gozerrors_aix_ppc.gozerrors_aix_ppc64.gozerrors_darwin_amd64.gozerrors_darwin_arm64.gozerrors_dragonfly_amd64.gozerrors_freebsd_386.gozerrors_freebsd_amd64.gozerrors_freebsd_arm.gozerrors_freebsd_arm64.gozerrors_linux.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_ppc.gozerrors_linux_ppc64.gozerrors_linux_ppc64le.gozerrors_linux_riscv64.gozerrors_linux_s390x.gozerrors_linux_sparc64.gozerrors_netbsd_386.gozerrors_netbsd_amd64.gozerrors_netbsd_arm.gozerrors_netbsd_arm64.gozerrors_openbsd_386.gozerrors_openbsd_amd64.gozerrors_openbsd_arm.gozerrors_openbsd_arm64.gozerrors_openbsd_mips64.gozerrors_solaris_amd64.gozerrors_zos_s390x.gozptrace_armnn_linux.gozptrace_linux_arm64.gozptrace_mipsnn_linux.gozptrace_mipsnnle_linux.gozptrace_x86_linux.gozsyscall_aix_ppc.gozsyscall_aix_ppc64.gozsyscall_aix_ppc64_gc.gozsyscall_aix_ppc64_gccgo.gozsyscall_darwin_amd64.1_13.gozsyscall_darwin_amd64.1_13.szsyscall_darwin_amd64.gozsyscall_darwin_amd64.szsyscall_darwin_arm64.1_13.gozsyscall_darwin_arm64.1_13.szsyscall_darwin_arm64.gozsyscall_darwin_arm64.szsyscall_dragonfly_amd64.gozsyscall_freebsd_386.gozsyscall_freebsd_amd64.gozsyscall_freebsd_arm.gozsyscall_freebsd_arm64.gozsyscall_illumos_amd64.gozsyscall_linux.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_ppc.gozsyscall_linux_ppc64.gozsyscall_linux_ppc64le.gozsyscall_linux_riscv64.gozsyscall_linux_s390x.gozsyscall_linux_sparc64.gozsyscall_netbsd_386.gozsyscall_netbsd_amd64.gozsyscall_netbsd_arm.gozsyscall_netbsd_arm64.gozsyscall_openbsd_386.gozsyscall_openbsd_amd64.gozsyscall_openbsd_arm.gozsyscall_openbsd_arm64.gozsyscall_openbsd_mips64.gozsyscall_solaris_amd64.gozsyscall_zos_s390x.gozsysctl_openbsd_386.gozsysctl_openbsd_amd64.gozsysctl_openbsd_arm.gozsysctl_openbsd_arm64.gozsysctl_openbsd_mips64.gozsysnum_darwin_amd64.gozsysnum_darwin_arm64.gozsysnum_dragonfly_amd64.gozsysnum_freebsd_386.gozsysnum_freebsd_amd64.gozsysnum_freebsd_arm.gozsysnum_freebsd_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_ppc.gozsysnum_linux_ppc64.gozsysnum_linux_ppc64le.gozsysnum_linux_riscv64.gozsysnum_linux_s390x.gozsysnum_linux_sparc64.gozsysnum_netbsd_386.gozsysnum_netbsd_amd64.gozsysnum_netbsd_arm.gozsysnum_netbsd_arm64.gozsysnum_openbsd_386.gozsysnum_openbsd_amd64.gozsysnum_openbsd_arm.gozsysnum_openbsd_arm64.gozsysnum_openbsd_mips64.gozsysnum_zos_s390x.goztypes_aix_ppc.goztypes_aix_ppc64.goztypes_darwin_amd64.goztypes_darwin_arm64.goztypes_dragonfly_amd64.goztypes_freebsd_386.goztypes_freebsd_amd64.goztypes_freebsd_arm.goztypes_freebsd_arm64.goztypes_illumos_amd64.goztypes_linux.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_ppc.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_386.goztypes_openbsd_amd64.goztypes_openbsd_arm.goztypes_openbsd_arm64.goztypes_openbsd_mips64.goztypes_solaris_amd64.goztypes_zos_s390x.go
text
google.golang.org
api
appengine
.travis.ymlCONTRIBUTING.mdLICENSEREADME.mdappengine.goappengine_vm.go
datastore
errors.goidentity.gointernal
api.goapi_classic.goapi_common.goapp_id.go
namespace.gotimeout.gotravis_install.shtravis_test.shapp_identity
base
datastore
identity.goidentity_classic.goidentity_flex.goidentity_vm.gointernal.golog
main.gomain_common.gomain_vm.gometadata.gomodules
net.goregen.shremote_api
transaction.gourlfetch
urlfetch
genproto
grpc
.travis.ymlAUTHORSCODE-OF-CONDUCT.mdCONTRIBUTING.mdGOVERNANCE.mdLICENSEMAINTAINERS.mdMakefileREADME.mdcall.goclientconn.gocodec.gocodegen.shtrace.goversion.govet.sh
attributes
backoff.gobackoff
balancer.gobalancer
balancer_conn_wrappers.gobalancer_v1_wrapper.gobinarylog
grpc_binarylog_v1
codes
connectivity
credentials
dialoptions.godoc.goencoding
grpclog
health
install_gae.shinterceptor.gointernal
backoff
balancerload
binarylog
buffer
channelz
envconfig
grpcrand
grpcsync
internal.goresolver
syscall
transport
keepalive
metadata
naming
peer
picker_wrapper.gopickfirst.gopreloader.goproxy.goresolver
resolver_conn_wrapper.gorpc_util.goserver.goservice_config.goserviceconfig
stats
status
stream.gotap
test
bufconn
552
vendor/github.com/google/go-cmp/cmp/options.go
generated
vendored
Normal file
552
vendor/github.com/google/go-cmp/cmp/options.go
generated
vendored
Normal file
@ -0,0 +1,552 @@
|
||||
// Copyright 2017, The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package cmp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/google/go-cmp/cmp/internal/function"
|
||||
)
|
||||
|
||||
// Option configures for specific behavior of Equal and Diff. In particular,
|
||||
// the fundamental Option functions (Ignore, Transformer, and Comparer),
|
||||
// configure how equality is determined.
|
||||
//
|
||||
// The fundamental options may be composed with filters (FilterPath and
|
||||
// FilterValues) to control the scope over which they are applied.
|
||||
//
|
||||
// The cmp/cmpopts package provides helper functions for creating options that
|
||||
// may be used with Equal and Diff.
|
||||
type Option interface {
|
||||
// filter applies all filters and returns the option that remains.
|
||||
// Each option may only read s.curPath and call s.callTTBFunc.
|
||||
//
|
||||
// An Options is returned only if multiple comparers or transformers
|
||||
// can apply simultaneously and will only contain values of those types
|
||||
// or sub-Options containing values of those types.
|
||||
filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption
|
||||
}
|
||||
|
||||
// applicableOption represents the following types:
|
||||
// Fundamental: ignore | validator | *comparer | *transformer
|
||||
// Grouping: Options
|
||||
type applicableOption interface {
|
||||
Option
|
||||
|
||||
// apply executes the option, which may mutate s or panic.
|
||||
apply(s *state, vx, vy reflect.Value)
|
||||
}
|
||||
|
||||
// coreOption represents the following types:
|
||||
// Fundamental: ignore | validator | *comparer | *transformer
|
||||
// Filters: *pathFilter | *valuesFilter
|
||||
type coreOption interface {
|
||||
Option
|
||||
isCore()
|
||||
}
|
||||
|
||||
type core struct{}
|
||||
|
||||
func (core) isCore() {}
|
||||
|
||||
// Options is a list of Option values that also satisfies the Option interface.
|
||||
// Helper comparison packages may return an Options value when packing multiple
|
||||
// Option values into a single Option. When this package processes an Options,
|
||||
// it will be implicitly expanded into a flat list.
|
||||
//
|
||||
// Applying a filter on an Options is equivalent to applying that same filter
|
||||
// on all individual options held within.
|
||||
type Options []Option
|
||||
|
||||
func (opts Options) filter(s *state, t reflect.Type, vx, vy reflect.Value) (out applicableOption) {
|
||||
for _, opt := range opts {
|
||||
switch opt := opt.filter(s, t, vx, vy); opt.(type) {
|
||||
case ignore:
|
||||
return ignore{} // Only ignore can short-circuit evaluation
|
||||
case validator:
|
||||
out = validator{} // Takes precedence over comparer or transformer
|
||||
case *comparer, *transformer, Options:
|
||||
switch out.(type) {
|
||||
case nil:
|
||||
out = opt
|
||||
case validator:
|
||||
// Keep validator
|
||||
case *comparer, *transformer, Options:
|
||||
out = Options{out, opt} // Conflicting comparers or transformers
|
||||
}
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func (opts Options) apply(s *state, _, _ reflect.Value) {
|
||||
const warning = "ambiguous set of applicable options"
|
||||
const help = "consider using filters to ensure at most one Comparer or Transformer may apply"
|
||||
var ss []string
|
||||
for _, opt := range flattenOptions(nil, opts) {
|
||||
ss = append(ss, fmt.Sprint(opt))
|
||||
}
|
||||
set := strings.Join(ss, "\n\t")
|
||||
panic(fmt.Sprintf("%s at %#v:\n\t%s\n%s", warning, s.curPath, set, help))
|
||||
}
|
||||
|
||||
func (opts Options) String() string {
|
||||
var ss []string
|
||||
for _, opt := range opts {
|
||||
ss = append(ss, fmt.Sprint(opt))
|
||||
}
|
||||
return fmt.Sprintf("Options{%s}", strings.Join(ss, ", "))
|
||||
}
|
||||
|
||||
// FilterPath returns a new Option where opt is only evaluated if filter f
|
||||
// returns true for the current Path in the value tree.
|
||||
//
|
||||
// This filter is called even if a slice element or map entry is missing and
|
||||
// provides an opportunity to ignore such cases. The filter function must be
|
||||
// symmetric such that the filter result is identical regardless of whether the
|
||||
// missing value is from x or y.
|
||||
//
|
||||
// The option passed in may be an Ignore, Transformer, Comparer, Options, or
|
||||
// a previously filtered Option.
|
||||
func FilterPath(f func(Path) bool, opt Option) Option {
|
||||
if f == nil {
|
||||
panic("invalid path filter function")
|
||||
}
|
||||
if opt := normalizeOption(opt); opt != nil {
|
||||
return &pathFilter{fnc: f, opt: opt}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type pathFilter struct {
|
||||
core
|
||||
fnc func(Path) bool
|
||||
opt Option
|
||||
}
|
||||
|
||||
func (f pathFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption {
|
||||
if f.fnc(s.curPath) {
|
||||
return f.opt.filter(s, t, vx, vy)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f pathFilter) String() string {
|
||||
return fmt.Sprintf("FilterPath(%s, %v)", function.NameOf(reflect.ValueOf(f.fnc)), f.opt)
|
||||
}
|
||||
|
||||
// FilterValues returns a new Option where opt is only evaluated if filter f,
|
||||
// which is a function of the form "func(T, T) bool", returns true for the
|
||||
// current pair of values being compared. If either value is invalid or
|
||||
// the type of the values is not assignable to T, then this filter implicitly
|
||||
// returns false.
|
||||
//
|
||||
// The filter function must be
|
||||
// symmetric (i.e., agnostic to the order of the inputs) and
|
||||
// deterministic (i.e., produces the same result when given the same inputs).
|
||||
// If T is an interface, it is possible that f is called with two values with
|
||||
// different concrete types that both implement T.
|
||||
//
|
||||
// The option passed in may be an Ignore, Transformer, Comparer, Options, or
|
||||
// a previously filtered Option.
|
||||
func FilterValues(f interface{}, opt Option) Option {
|
||||
v := reflect.ValueOf(f)
|
||||
if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() {
|
||||
panic(fmt.Sprintf("invalid values filter function: %T", f))
|
||||
}
|
||||
if opt := normalizeOption(opt); opt != nil {
|
||||
vf := &valuesFilter{fnc: v, opt: opt}
|
||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
||||
vf.typ = ti
|
||||
}
|
||||
return vf
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type valuesFilter struct {
|
||||
core
|
||||
typ reflect.Type // T
|
||||
fnc reflect.Value // func(T, T) bool
|
||||
opt Option
|
||||
}
|
||||
|
||||
func (f valuesFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption {
|
||||
if !vx.IsValid() || !vx.CanInterface() || !vy.IsValid() || !vy.CanInterface() {
|
||||
return nil
|
||||
}
|
||||
if (f.typ == nil || t.AssignableTo(f.typ)) && s.callTTBFunc(f.fnc, vx, vy) {
|
||||
return f.opt.filter(s, t, vx, vy)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f valuesFilter) String() string {
|
||||
return fmt.Sprintf("FilterValues(%s, %v)", function.NameOf(f.fnc), f.opt)
|
||||
}
|
||||
|
||||
// Ignore is an Option that causes all comparisons to be ignored.
|
||||
// This value is intended to be combined with FilterPath or FilterValues.
|
||||
// It is an error to pass an unfiltered Ignore option to Equal.
|
||||
func Ignore() Option { return ignore{} }
|
||||
|
||||
type ignore struct{ core }
|
||||
|
||||
func (ignore) isFiltered() bool { return false }
|
||||
func (ignore) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { return ignore{} }
|
||||
func (ignore) apply(s *state, _, _ reflect.Value) { s.report(true, reportByIgnore) }
|
||||
func (ignore) String() string { return "Ignore()" }
|
||||
|
||||
// validator is a sentinel Option type to indicate that some options could not
|
||||
// be evaluated due to unexported fields, missing slice elements, or
|
||||
// missing map entries. Both values are validator only for unexported fields.
|
||||
type validator struct{ core }
|
||||
|
||||
func (validator) filter(_ *state, _ reflect.Type, vx, vy reflect.Value) applicableOption {
|
||||
if !vx.IsValid() || !vy.IsValid() {
|
||||
return validator{}
|
||||
}
|
||||
if !vx.CanInterface() || !vy.CanInterface() {
|
||||
return validator{}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (validator) apply(s *state, vx, vy reflect.Value) {
|
||||
// Implies missing slice element or map entry.
|
||||
if !vx.IsValid() || !vy.IsValid() {
|
||||
s.report(vx.IsValid() == vy.IsValid(), 0)
|
||||
return
|
||||
}
|
||||
|
||||
// Unable to Interface implies unexported field without visibility access.
|
||||
if !vx.CanInterface() || !vy.CanInterface() {
|
||||
help := "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported"
|
||||
var name string
|
||||
if t := s.curPath.Index(-2).Type(); t.Name() != "" {
|
||||
// Named type with unexported fields.
|
||||
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
|
||||
if _, ok := reflect.New(t).Interface().(error); ok {
|
||||
help = "consider using cmpopts.EquateErrors to compare error values"
|
||||
}
|
||||
} else {
|
||||
// Unnamed type with unexported fields. Derive PkgPath from field.
|
||||
var pkgPath string
|
||||
for i := 0; i < t.NumField() && pkgPath == ""; i++ {
|
||||
pkgPath = t.Field(i).PkgPath
|
||||
}
|
||||
name = fmt.Sprintf("%q.(%v)", pkgPath, t.String()) // e.g., "path/to/package".(struct { a int })
|
||||
}
|
||||
panic(fmt.Sprintf("cannot handle unexported field at %#v:\n\t%v\n%s", s.curPath, name, help))
|
||||
}
|
||||
|
||||
panic("not reachable")
|
||||
}
|
||||
|
||||
// identRx represents a valid identifier according to the Go specification.
|
||||
const identRx = `[_\p{L}][_\p{L}\p{N}]*`
|
||||
|
||||
var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`)
|
||||
|
||||
// Transformer returns an Option that applies a transformation function that
|
||||
// converts values of a certain type into that of another.
|
||||
//
|
||||
// The transformer f must be a function "func(T) R" that converts values of
|
||||
// type T to those of type R and is implicitly filtered to input values
|
||||
// assignable to T. The transformer must not mutate T in any way.
|
||||
//
|
||||
// To help prevent some cases of infinite recursive cycles applying the
|
||||
// same transform to the output of itself (e.g., in the case where the
|
||||
// input and output types are the same), an implicit filter is added such that
|
||||
// a transformer is applicable only if that exact transformer is not already
|
||||
// in the tail of the Path since the last non-Transform step.
|
||||
// For situations where the implicit filter is still insufficient,
|
||||
// consider using cmpopts.AcyclicTransformer, which adds a filter
|
||||
// to prevent the transformer from being recursively applied upon itself.
|
||||
//
|
||||
// The name is a user provided label that is used as the Transform.Name in the
|
||||
// transformation PathStep (and eventually shown in the Diff output).
|
||||
// The name must be a valid identifier or qualified identifier in Go syntax.
|
||||
// If empty, an arbitrary name is used.
|
||||
func Transformer(name string, f interface{}) Option {
|
||||
v := reflect.ValueOf(f)
|
||||
if !function.IsType(v.Type(), function.Transformer) || v.IsNil() {
|
||||
panic(fmt.Sprintf("invalid transformer function: %T", f))
|
||||
}
|
||||
if name == "" {
|
||||
name = function.NameOf(v)
|
||||
if !identsRx.MatchString(name) {
|
||||
name = "λ" // Lambda-symbol as placeholder name
|
||||
}
|
||||
} else if !identsRx.MatchString(name) {
|
||||
panic(fmt.Sprintf("invalid name: %q", name))
|
||||
}
|
||||
tr := &transformer{name: name, fnc: reflect.ValueOf(f)}
|
||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
||||
tr.typ = ti
|
||||
}
|
||||
return tr
|
||||
}
|
||||
|
||||
type transformer struct {
|
||||
core
|
||||
name string
|
||||
typ reflect.Type // T
|
||||
fnc reflect.Value // func(T) R
|
||||
}
|
||||
|
||||
func (tr *transformer) isFiltered() bool { return tr.typ != nil }
|
||||
|
||||
func (tr *transformer) filter(s *state, t reflect.Type, _, _ reflect.Value) applicableOption {
|
||||
for i := len(s.curPath) - 1; i >= 0; i-- {
|
||||
if t, ok := s.curPath[i].(Transform); !ok {
|
||||
break // Hit most recent non-Transform step
|
||||
} else if tr == t.trans {
|
||||
return nil // Cannot directly use same Transform
|
||||
}
|
||||
}
|
||||
if tr.typ == nil || t.AssignableTo(tr.typ) {
|
||||
return tr
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tr *transformer) apply(s *state, vx, vy reflect.Value) {
|
||||
step := Transform{&transform{pathStep{typ: tr.fnc.Type().Out(0)}, tr}}
|
||||
vvx := s.callTRFunc(tr.fnc, vx, step)
|
||||
vvy := s.callTRFunc(tr.fnc, vy, step)
|
||||
step.vx, step.vy = vvx, vvy
|
||||
s.compareAny(step)
|
||||
}
|
||||
|
||||
func (tr transformer) String() string {
|
||||
return fmt.Sprintf("Transformer(%s, %s)", tr.name, function.NameOf(tr.fnc))
|
||||
}
|
||||
|
||||
// Comparer returns an Option that determines whether two values are equal
|
||||
// to each other.
|
||||
//
|
||||
// The comparer f must be a function "func(T, T) bool" and is implicitly
|
||||
// filtered to input values assignable to T. If T is an interface, it is
|
||||
// possible that f is called with two values of different concrete types that
|
||||
// both implement T.
|
||||
//
|
||||
// The equality function must be:
|
||||
// • Symmetric: equal(x, y) == equal(y, x)
|
||||
// • Deterministic: equal(x, y) == equal(x, y)
|
||||
// • Pure: equal(x, y) does not modify x or y
|
||||
func Comparer(f interface{}) Option {
|
||||
v := reflect.ValueOf(f)
|
||||
if !function.IsType(v.Type(), function.Equal) || v.IsNil() {
|
||||
panic(fmt.Sprintf("invalid comparer function: %T", f))
|
||||
}
|
||||
cm := &comparer{fnc: v}
|
||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
||||
cm.typ = ti
|
||||
}
|
||||
return cm
|
||||
}
|
||||
|
||||
type comparer struct {
|
||||
core
|
||||
typ reflect.Type // T
|
||||
fnc reflect.Value // func(T, T) bool
|
||||
}
|
||||
|
||||
func (cm *comparer) isFiltered() bool { return cm.typ != nil }
|
||||
|
||||
func (cm *comparer) filter(_ *state, t reflect.Type, _, _ reflect.Value) applicableOption {
|
||||
if cm.typ == nil || t.AssignableTo(cm.typ) {
|
||||
return cm
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cm *comparer) apply(s *state, vx, vy reflect.Value) {
|
||||
eq := s.callTTBFunc(cm.fnc, vx, vy)
|
||||
s.report(eq, reportByFunc)
|
||||
}
|
||||
|
||||
func (cm comparer) String() string {
|
||||
return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc))
|
||||
}
|
||||
|
||||
// Exporter returns an Option that specifies whether Equal is allowed to
|
||||
// introspect into the unexported fields of certain struct types.
|
||||
//
|
||||
// Users of this option must understand that comparing on unexported fields
|
||||
// from external packages is not safe since changes in the internal
|
||||
// implementation of some external package may cause the result of Equal
|
||||
// to unexpectedly change. However, it may be valid to use this option on types
|
||||
// defined in an internal package where the semantic meaning of an unexported
|
||||
// field is in the control of the user.
|
||||
//
|
||||
// In many cases, a custom Comparer should be used instead that defines
|
||||
// equality as a function of the public API of a type rather than the underlying
|
||||
// unexported implementation.
|
||||
//
|
||||
// For example, the reflect.Type documentation defines equality to be determined
|
||||
// by the == operator on the interface (essentially performing a shallow pointer
|
||||
// comparison) and most attempts to compare *regexp.Regexp types are interested
|
||||
// in only checking that the regular expression strings are equal.
|
||||
// Both of these are accomplished using Comparers:
|
||||
//
|
||||
// Comparer(func(x, y reflect.Type) bool { return x == y })
|
||||
// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() })
|
||||
//
|
||||
// In other cases, the cmpopts.IgnoreUnexported option can be used to ignore
|
||||
// all unexported fields on specified struct types.
|
||||
func Exporter(f func(reflect.Type) bool) Option {
|
||||
if !supportExporters {
|
||||
panic("Exporter is not supported on purego builds")
|
||||
}
|
||||
return exporter(f)
|
||||
}
|
||||
|
||||
type exporter func(reflect.Type) bool
|
||||
|
||||
func (exporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
// AllowUnexported returns an Options that allows Equal to forcibly introspect
|
||||
// unexported fields of the specified struct types.
|
||||
//
|
||||
// See Exporter for the proper use of this option.
|
||||
func AllowUnexported(types ...interface{}) Option {
|
||||
m := make(map[reflect.Type]bool)
|
||||
for _, typ := range types {
|
||||
t := reflect.TypeOf(typ)
|
||||
if t.Kind() != reflect.Struct {
|
||||
panic(fmt.Sprintf("invalid struct type: %T", typ))
|
||||
}
|
||||
m[t] = true
|
||||
}
|
||||
return exporter(func(t reflect.Type) bool { return m[t] })
|
||||
}
|
||||
|
||||
// Result represents the comparison result for a single node and
|
||||
// is provided by cmp when calling Result (see Reporter).
|
||||
type Result struct {
|
||||
_ [0]func() // Make Result incomparable
|
||||
flags resultFlags
|
||||
}
|
||||
|
||||
// Equal reports whether the node was determined to be equal or not.
|
||||
// As a special case, ignored nodes are considered equal.
|
||||
func (r Result) Equal() bool {
|
||||
return r.flags&(reportEqual|reportByIgnore) != 0
|
||||
}
|
||||
|
||||
// ByIgnore reports whether the node is equal because it was ignored.
|
||||
// This never reports true if Equal reports false.
|
||||
func (r Result) ByIgnore() bool {
|
||||
return r.flags&reportByIgnore != 0
|
||||
}
|
||||
|
||||
// ByMethod reports whether the Equal method determined equality.
|
||||
func (r Result) ByMethod() bool {
|
||||
return r.flags&reportByMethod != 0
|
||||
}
|
||||
|
||||
// ByFunc reports whether a Comparer function determined equality.
|
||||
func (r Result) ByFunc() bool {
|
||||
return r.flags&reportByFunc != 0
|
||||
}
|
||||
|
||||
// ByCycle reports whether a reference cycle was detected.
|
||||
func (r Result) ByCycle() bool {
|
||||
return r.flags&reportByCycle != 0
|
||||
}
|
||||
|
||||
type resultFlags uint
|
||||
|
||||
const (
|
||||
_ resultFlags = (1 << iota) / 2
|
||||
|
||||
reportEqual
|
||||
reportUnequal
|
||||
reportByIgnore
|
||||
reportByMethod
|
||||
reportByFunc
|
||||
reportByCycle
|
||||
)
|
||||
|
||||
// Reporter is an Option that can be passed to Equal. When Equal traverses
|
||||
// the value trees, it calls PushStep as it descends into each node in the
|
||||
// tree and PopStep as it ascend out of the node. The leaves of the tree are
|
||||
// either compared (determined to be equal or not equal) or ignored and reported
|
||||
// as such by calling the Report method.
|
||||
func Reporter(r interface {
|
||||
// PushStep is called when a tree-traversal operation is performed.
|
||||
// The PathStep itself is only valid until the step is popped.
|
||||
// The PathStep.Values are valid for the duration of the entire traversal
|
||||
// and must not be mutated.
|
||||
//
|
||||
// Equal always calls PushStep at the start to provide an operation-less
|
||||
// PathStep used to report the root values.
|
||||
//
|
||||
// Within a slice, the exact set of inserted, removed, or modified elements
|
||||
// is unspecified and may change in future implementations.
|
||||
// The entries of a map are iterated through in an unspecified order.
|
||||
PushStep(PathStep)
|
||||
|
||||
// Report is called exactly once on leaf nodes to report whether the
|
||||
// comparison identified the node as equal, unequal, or ignored.
|
||||
// A leaf node is one that is immediately preceded by and followed by
|
||||
// a pair of PushStep and PopStep calls.
|
||||
Report(Result)
|
||||
|
||||
// PopStep ascends back up the value tree.
|
||||
// There is always a matching pop call for every push call.
|
||||
PopStep()
|
||||
}) Option {
|
||||
return reporter{r}
|
||||
}
|
||||
|
||||
type reporter struct{ reporterIface }
|
||||
type reporterIface interface {
|
||||
PushStep(PathStep)
|
||||
Report(Result)
|
||||
PopStep()
|
||||
}
|
||||
|
||||
func (reporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
// normalizeOption normalizes the input options such that all Options groups
|
||||
// are flattened and groups with a single element are reduced to that element.
|
||||
// Only coreOptions and Options containing coreOptions are allowed.
|
||||
func normalizeOption(src Option) Option {
|
||||
switch opts := flattenOptions(nil, Options{src}); len(opts) {
|
||||
case 0:
|
||||
return nil
|
||||
case 1:
|
||||
return opts[0]
|
||||
default:
|
||||
return opts
|
||||
}
|
||||
}
|
||||
|
||||
// flattenOptions copies all options in src to dst as a flat list.
|
||||
// Only coreOptions and Options containing coreOptions are allowed.
|
||||
func flattenOptions(dst, src Options) Options {
|
||||
for _, opt := range src {
|
||||
switch opt := opt.(type) {
|
||||
case nil:
|
||||
continue
|
||||
case Options:
|
||||
dst = flattenOptions(dst, opt)
|
||||
case coreOption:
|
||||
dst = append(dst, opt)
|
||||
default:
|
||||
panic(fmt.Sprintf("invalid option type: %T", opt))
|
||||
}
|
||||
}
|
||||
return dst
|
||||
}
|
Reference in New Issue
Block a user